Beklendiği gibi SQLite işlem çalışmıyor

1 Cevap php

Ben 2 dosya, "1.PHP" ve "2.PHP" hazırladı.

"1.php" bu gibi.

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

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

print "bbb";
?>

ve "2.php" bu gibi.

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

print "ccc<br>";
$dbh->commit();
print "ddd";
?>

ve ben "1.PHP" excute. Bu bir hareket başlatır ve 55 saniye bekler.

Ben hemen "2.PHP" excute Yani, benim beklentim şudur:

  1. "1.php" işlem oluyor ve
  2. "1" veritabanı kilit tutan
  3. "2" bir işlem başlayamaz
  4. "2" veritabanı kilit alınamıyor
  5. "2" 55 saniye beklemek zorunda

ANCAK, ancak test başka bir yol gitti. Daha sonra "2", excute zaman

  1. "2" hemen sonucudur döndü
  2. "2" beklemedi

bu yüzden "1" işlem alamadım düşünmek zorunda, veya veritabanı kilit alamadım.

Herkes yardımcı olabilir?

1 Cevap

Anladığım kadarıyla, SQLite işlemler veritabanı sürece kilidi yok

  • a. Eğer bunları yapmak EXCLUSIVE (onlar DEFERRED varsayılan olarak), ya da
  • b. aslında veritabanına erişmek

Yani açıkça diyoruz ya

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

Eğer sleep() başlamadan önce veya (INSERT / UPDATE) DB yazma işlemi yapmak.

documentation (vurgu benim) alıntı için:

Transactions can be deferred, immediate, or exclusive. The default transaction behavior is deferred. Deferred means that no locks are acquired on the database until the database is first accessed. Thus with a deferred transaction, the BEGIN statement itself does nothing. Locks are not acquired until the first read or write operation. The first read operation against a database creates a SHARED lock and the first write operation creates a RESERVED lock.