transacciones con clase begintransaction php sqlite pdo transactions

con - php pdo rollback



La transacción SQLite no funciona como se esperaba (1)

Según tengo entendido, las transacciones de SQLite no bloquean la base de datos a menos que

  • a. los haces EXCLUSIVE (están DEFERRED por defecto), o
  • segundo. realmente accedes a la base de datos

Entonces, o llamas explícitamente

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

o realiza una operación de escritura ( INSERT / UPDATE ) al DB antes de comenzar a sleep() .

Para citar la documentación (énfasis mío):

Las transacciones pueden ser diferidas, inmediatas o exclusivas. El comportamiento de transacción predeterminado se difiere. Diferido significa que no se adquieren bloqueos en la base de datos hasta que se accede por primera vez a la base de datos. Por lo tanto, con una transacción diferida, la declaración BEGIN sí misma no hace nada. Los bloqueos no se adquieren hasta la primera operación de lectura o 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.

Preparé 2 archivos, "1.php" y "2.php".

"1.php" es así.

<?php $dbh = new PDO(''sqlite:test1''); $dbh->beginTransaction(); print "aaa<br>"; sleep(55); $dbh->commit(); print "bbb"; ?>

y "2.php" es así.

<?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.

Entonces cuando de inmediato ejecuto "2.php", mi expectativa es esta:

  1. "1.php" está recibiendo transacción y
  2. "1" contiene un bloqueo de base de datos
  3. "2" no puede comenzar una transacción
  4. "2" no puede obtener el bloqueo de la base de datos por lo
  5. "2" tiene que esperar 55 segundos

PERO, pero la prueba fue de otra manera. Cuando ejecuto "2", entonces

  1. "2" devolvió inmediatamente su resultado
  2. "2" no esperó

así que tengo que pensar que "1" no pudo obtener la transacción, o no pudo obtener el bloqueo de la base de datos.

¿Alguien puede ayudar?