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ánDEFERRED
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.php" está recibiendo transacción y
- "1" contiene un bloqueo de base de datos
- "2" no puede comenzar una transacción
- "2" no puede obtener el bloqueo de la base de datos por lo
- "2" tiene que esperar 55 segundos
PERO, pero la prueba fue de otra manera. Cuando ejecuto "2", entonces
- "2" devolvió inmediatamente su resultado
- "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?