SQLite - Transacciones

Una transacción es una unidad de trabajo que se realiza en una base de datos. Las transacciones son unidades o secuencias de trabajo realizadas en un orden lógico, ya sea de forma manual por un usuario o automáticamente por algún tipo de programa de base de datos.

Una transacción es la propagación de uno o más cambios en la base de datos. Por ejemplo, si está creando, actualizando o eliminando un registro de la tabla, entonces está realizando una transacción en la tabla. Es importante controlar las transacciones para garantizar la integridad de los datos y manejar los errores de la base de datos.

Prácticamente, agrupará muchas consultas SQLite en un grupo y las ejecutará todas juntas como parte de una transacción.

Propiedades de las transacciones

Las transacciones tienen las siguientes cuatro propiedades estándar, generalmente denominadas con el acrónimo ACID.

  • Atomicity- Asegura que todas las operaciones dentro de la unidad de trabajo se completen con éxito; de lo contrario, la transacción se aborta en el punto de falla y las operaciones anteriores se revierten a su estado anterior.

  • Consistency - Garantiza que la base de datos cambie correctamente de estado tras una transacción confirmada con éxito.

  • Isolation - Permite que las transacciones funcionen de forma independiente y transparente entre sí.

  • Durability - Asegura que el resultado o efecto de una transacción comprometida persista en caso de falla del sistema.

Control de transacciones

A continuación se muestran los siguientes comandos que se utilizan para controlar las transacciones:

  • BEGIN TRANSACTION - Para iniciar una transacción.

  • COMMIT - Para guardar los cambios, alternativamente puede usar END TRANSACTION mando.

  • ROLLBACK - Revertir los cambios.

Los comandos de control transaccional solo se utilizan con los comandos DML INSERT, UPDATE y DELETE. No se pueden usar al crear tablas o descartarlas porque estas operaciones se confirman automáticamente en la base de datos.

Comando COMENZAR TRANSACCIÓN

Las transacciones se pueden iniciar usando BEGIN TRANSACTION o simplemente el comando BEGIN. Estas transacciones generalmente persisten hasta que se encuentra el siguiente comando COMMIT o ROLLBACK. Sin embargo, una transacción también se ROLLBACK si la base de datos se cierra o si ocurre un error. A continuación se muestra la sintaxis simple para iniciar una transacción.

BEGIN;
or 
BEGIN TRANSACTION;

Comando COMMIT

El comando COMMIT es el comando transaccional que se utiliza para guardar los cambios invocados por una transacción en la base de datos.

El comando COMMIT guarda todas las transacciones en la base de datos desde el último comando COMMIT o ROLLBACK.

A continuación se muestra la sintaxis del comando COMMIT.

COMMIT;
or
END TRANSACTION;

Comando ROLLBACK

El comando ROLLBACK es el comando transaccional que se utiliza para deshacer transacciones que aún no se han guardado en la base de datos.

El comando ROLLBACK solo se puede utilizar para deshacer transacciones desde que se emitió el último comando COMMIT o ROLLBACK.

A continuación se muestra la sintaxis del comando ROLLBACK.

ROLLBACK;

Example

Considere la tabla EMPRESA con los siguientes registros.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Ahora, comencemos una transacción y eliminemos registros de la tabla que tengan edad = 25. Luego, use el comando ROLLBACK para deshacer todos los cambios.

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;

Ahora, si marca la tabla EMPRESA, todavía tiene los siguientes registros:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Comencemos otra transacción y eliminemos registros de la tabla que tengan edad = 25 y finalmente usamos el comando COMMIT para confirmar todos los cambios.

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> COMMIT;

Si ahora marca la tabla EMPRESA, todavía tiene los siguientes registros:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0