9 Transacciones

Las transacciones son operaciones sobre base de datos que se realizan de forma atómica en una o varias tablas. Pueden ser ejecutadas sobre la base de datos o deshechas en conjunto.

SQlite está optimizado para transacciones, es decir, las operaciones de inserción, modificación y borrado sobre tablas se ejecutarás más rápidamente si se realizan dentro de una transacción que si se realizan fuera.

Una transacción empieza con la sentencia BEGIN TRANSACTION, y termina con COMMIT TRANSACTION o con ROLLBACK TRANSACTION.

La palabra TRANSACTION es opcional y las sentencias COMMIT TRANSACTION y END TRANSACTION son equivalentes, por lo que podemos usar formas más reducidas, BEGIN, END o COMMIT y ROLLBACK.

En SQLite todas las modificaciones de base de datos se hacen dentro de una transacción, esto significa que cualquier sentencia, excepto SELECT, que no esté incluida en una transacción explícita, creará una transacción implícita que terminará justo después de ejecutada la sentencia.

Las transacciones se pueden anidar, estableciendo puntos de seguridad, mediante la sentencia SAVEPOINT. En el interior de una transacción podemos establecer tantos puntos de seguridad como necesitemos, cada uno con un nombre asociado. Las sentencias RELEASE y ROLLBACK se pueden aplicar a un punto de seguridad concreto.

sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO cancion (titulo,idartista) VALUES("La Macarena", 3);
sqlite> ROLLBACK;
sqlite> SELECT * FROM cancion;
idcancion|titulo|idartista
1|Tubular Bells|1
2|Yellow Submarine|2
3|Get Back|2
4|Yesterday|2
5|Moonlight Shadow|1
sqlite>

Al hacer un rollback de la transacción, la fila añadida no se transfiere a la base de datos, y los cambios realizados dentro de la transacción quedan sin efecto.

sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO cancion (titulo,idartista) VALUES("Sympathy for the Devil", 3);
sqlite> COMMIT;
sqlite> SELECT * FROM cancion;
idcancion|titulo|idartista
1|Tubular Bells|1
2|Yellow Submarine|2
3|Get Back|2
4|Yesterday|2
5|Moonlight Shadow|1
6|Sympathy for the Devil|3
sqlite>

Al terminar la transacción con un commit, los cambios se transfieren a la base de datos de forma definitiva.

Puntos de seguridad

Los puntos de seguridad nos permiten establecer puntos de retorno para hacer rollback o commit de forma anidada. En ocasiones ciertas transacciones dependen del resultado de operaciones posteriores, y lo que en un momento puede ser válido, más tarde puede quedar anulado.

sqlite> CREATE TABLE ejemplo (
...> id INTEGER,
...> nombre TEXT);
sqlite> INSERT INTO ejemplo VALUES(1,"Juan");
sqlite> SAVEPOINT punto1;
sqlite> INSERT INTO ejemplo VALUES(2,"Antonio");
sqlite> SAVEPOINT punto2;
sqlite> INSERT INTO ejemplo VALUES(3,"Pedro");
sqlite> ROLLBACK TO punto2;
sqlite> INSERT INTO ejemplo VALUES(4,"Carlos");
sqlite> RELEASE punto1;
sqlite> SELECT * FROM ejemplo;
id,nombre
1,Juan
2,Antonio
4,Carlos
sqlite>

En este ejemplo, la inserción de la fila (3,"Pedro") queda anulada al hacer un rollback del punto de seguridad "punto2". Sin embargo, el resto de las inserciones se ejecutan al hacer un release del "punto1".