2009-02-19 14 views
5

2 dosya, "1.php" ve "2.php" hazırladım.SQLite işlemi beklendiği gibi çalışmıyor

"1.php" buna benzer.

<?php 
$dbh = new PDO('sqlite:test1'); 
$dbh->beginTransaction(); 

print "aaa<br>"; 
sleep(55); 
$dbh->commit(); 

print "bbb"; 
?> 
ve "2.php" buna benzer. ve "1.php" yi kesiyorum. Bir işlem başlatır ve 55 saniye bekler.

yüzden hemen "2.PHP" excute, benim beklenti şu:

  1. "1.php" oluyor işlem ve
  2. "1" bir veri tabanı kilitlemek tutan
  3. "2 "bir işlemi başlayamaz
  4. '2' veritabanı kilitlenemiyoruz böylece
  5. '2' 55 saniye
beklemek zorunda

AMA, ama test başka bir şekilde gitti. Sonra, "2" excute zaman

  1. "2" derhal, bu

yüzden "1" işlemi alınamadı düşünmek zorunda beklemedi sonuç

  • "2" bulunuyor döndü veya veritabanı kilidi alınamadı.

    Herkes yardımcı olabilir mi?

  • cevap

    9

    Anladığım kadarıyla, SQLite işlemler

    • sürece bir veritabanı kilitlenmez. Onları EXCLUSIVE yapın (varsayılan olarak DEFERRED) veya
    • b. aslında Yani ya açıkça

      $dbh->exec("BEGIN EXCLUSIVE TRANSACTION"); 
      

      çağrı veritabanını

    erişmek veya sleep() başlamadan önce DB yazma işlemi (INSERT/UPDATE) yapmak.

    documentation (vurgu benim) bahsetmek gerekirse:

    İşlemleri ertelenebilir, derhal veya münhasır. Varsayılan işlem davranışı ertelendi. Ertelenen, veritabanına ilk kez erişilinceye kadar hiçbir kilitlenmenin veritabanı üzerinde alınmadığı anlamına gelir. Böylece, ertelenmiş bir işlemle, BEGIN ifadesinin kendisi hiçbir şey yapmaz. Kilitler ilk kez okunana kadar alınmaz veya yazma işlemi.Bir veritabanına karşı ilk kez okunan , bir SHARED kilidi oluşturur ve ilk yazılan işlemi REZERV Kilitleme bir kilit oluşturur.