2009-02-19 12 views
5

Preparé 2 archivos, "1.php" y "2.php".La transacción SQLite no funciona como se esperaba

"1.php" es como esto.

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

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

print "bbb"; 
?> 

y "2.php" es como esto.

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

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

y exijo "1.php". Inicia una transacción y espera 55 segundos.

Así que cuando súbitamente excute "2.PHP", mi expectativa es la siguiente:

  1. "1.php" es cada transacción y
  2. "1" bloqueo mantiene una base de datos
  3. "2 "no se puede iniciar una transacción
  4. '2' no se puede obtener el bloqueo de base de datos de modo
  5. '2' tienen que esperar 55 segundos

PERO, pero la prueba fue de otra manera. Cuando excute "2", a continuación,

  1. "2" inmediatamente devuelto es resultado
  2. "2" no espere

por lo que tienen que pensar que "1" no pudo conseguir transacción, o no pudo obtener el bloqueo de la base de datos.

¿Alguien puede ayudar?

Respuesta

9

lo que tengo entendido, las transacciones de SQLite no bloquean la base de datos a menos

  • a. los haces EXCLUSIVE (son DEFERRED por defecto), o
  • b. en realidad se accede a la base de datos

Así que, o se llama explícitamente

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

o si realiza una operación de escritura (INSERT/UPDATE) a la base de datos antes de empezar a sleep().

citar el (el énfasis es mío) documentation:

Las transacciones pueden ser diferidos, inmediata, o exclusiva. El comportamiento predeterminado de la transacción es diferido. Deferido significa que no se han bloqueado en la base de datos hasta que se haya accedido por primera vez a la base de datos . Por lo tanto, con una transacción diferida, la declaración BEGIN en sí no hace nada. Los bloqueos no se adquieren hasta la primera lectura o la operación de escritura.La primera operación de lectura en una base de datos crea un bloqueo COMPARTIDO y la primera operación de escritura crea un bloqueo RESERVADO.

Cuestiones relacionadas