2009-02-19 11 views
5

Ho preparato 2 file, "1.php" e "2.php".La transazione SQLite non funziona come previsto

"1.php" è come questo.

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

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

print "bbb"; 
?> 

e "2.php" è come questo.

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

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

e I excute "1.php". Inizia una transazione e attende 55 secondi.

Così, quando ho subito excute "2.php", la mia aspettativa è questo:

  1. "1.php" sta ottenendo delle transazioni e
  2. "1" vale bloccare un database
  3. "2 "non può iniziare una transazione
  4. "2" non può ottenere il blocco di database in modo
  5. "2" devono attendere 55 secondi

MA, ma il test è andato in un altro modo. Quando ho excute "2", quindi

  1. "2" immediatamente restituito è risultato
  2. "2" non ha aspettato

quindi devo pensare che "1" non poteva ottenere di transazione, o non è stato possibile ottenere il blocco del database.

Qualcuno può aiutare?

risposta

9

Da quanto ho capito, le transazioni SQLite non bloccare il database a meno che

  • a. li fai EXCLUSIVE (sono DEFERRED per impostazione predefinita) o
  • b. effettivamente accedere al database

Quindi, o si chiama esplicitamente

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

o si effettua un'operazione di scrittura (INSERT/UPDATE) al DB prima di iniziare a sleep().

di citare la (sottolineatura mia) documentation:

Le transazioni possono essere differiti, immediato, o esclusiva. Il comportamento predefinito della transazione viene rinviato. Differito significa che nessun blocco è acquisito nel database finché non si accede per la prima volta al database . Quindi con la transazione differita , l'istruzione non fa nulla. Le serrature non vengono acquisite fino alla prima lettura o operazione di scrittura.La prima operazione di lettura su un database crea un blocco SHARED e la prima operazione di scrittura crea un blocco RISERVATO.

Problemi correlati