sql >> Base de Datos >  >> RDS >> SQLite

Transacción de SQLite

Resumen :en este tutorial, le mostraremos cómo usar la transacción SQLite para garantizar la integridad y confiabilidad de los datos.

SQLite y ÁCIDO

SQLite es una base de datos transaccional en la que todos los cambios y consultas son atómicos, coherentes, aislados y duraderos (ACID).

SQLite garantiza que todas las transacciones cumplen con ACID incluso si la transacción se interrumpe por un bloqueo del programa, un volcado del sistema operativo o un corte de energía en la computadora.

  • A tomic:una transacción debe ser atómica. Significa que un cambio no se puede dividir en otros más pequeños. Cuando confirma una transacción, se aplica toda la transacción o no.
  • C consistente:una transacción debe asegurarse de cambiar la base de datos de un estado válido a otro. Cuando se inicia una transacción y se ejecuta una declaración para modificar datos, la base de datos se vuelve inconsistente. Sin embargo, cuando la transacción se confirma o revierte, es importante que la transacción mantenga la coherencia de la base de datos.
  • Yo solación:una transacción pendiente realizada por una sesión debe aislarse de otras sesiones. Cuando una sesión inicia una transacción y ejecuta INSERT o UPDATE instrucción para cambiar los datos, estos cambios solo son visibles para la sesión actual, no para otros. Por otro lado, los cambios realizados por otras sesiones después de iniciada la transacción no deberían ser visibles para la sesión actual.
  • Duradero:si una transacción se confirma con éxito, los cambios deben ser permanentes en la base de datos, independientemente de la condición, como un corte de energía o un bloqueo del programa. Por el contrario, si el programa falla antes de que se confirme la transacción, el cambio no debería persistir.

Declaraciones de transacción de SQLite

De forma predeterminada, SQLite funciona en modo de confirmación automática. Significa que para cada comando, SQLite inicia, procesa y confirma la transacción automáticamente.

Para iniciar una transacción explícitamente, utiliza los siguientes pasos:

Primero, abra una transacción emitiendo BEGIN TRANSACTION comando.

BEGIN TRANSACTION;Code language: SQL (Structured Query Language) (sql)

Después de ejecutar la instrucción BEGIN TRANSACTION , la transacción está abierta hasta que se confirme o revierta explícitamente.

En segundo lugar, emita sentencias SQL para seleccionar o actualizar datos en la base de datos. Tenga en cuenta que el cambio solo es visible para la sesión actual (o cliente).

En tercer lugar, confirme los cambios en la base de datos utilizando COMMIT o COMMIT TRANSACTION declaración.

COMMIT;Code language: SQL (Structured Query Language) (sql)

Si no desea guardar los cambios, puede retroceder usando el ROLLBACK o ROLLBACK TRANSACTION declaración:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

Ejemplo de transacción de SQLite

Crearemos dos nuevas tablas:accounts y account_changes para la demostración.

Las accounts tabla almacena datos sobre los números de cuenta y sus saldos. Los account_changes tabla almacena los cambios de las cuentas.

Primero, crea las accounts y account_changes tablas usando el siguiente CREATE TABLE declaraciones:

CREATE TABLE accounts ( 
	account_no INTEGER NOT NULL, 
	balance DECIMAL NOT NULL DEFAULT 0,
	PRIMARY KEY(account_no),
        CHECK(balance >= 0)
);

CREATE TABLE account_changes (
	change_no INT NOT NULL PRIMARY KEY,
	account_no INTEGER NOT NULL, 
	flag TEXT NOT NULL, 
	amount DECIMAL NOT NULL, 
	changed_at TEXT NOT NULL 
);Code language: SQL (Structured Query Language) (sql)

En segundo lugar, inserte algunos datos de muestra en las accounts mesa.

INSERT INTO accounts (account_no,balance)
VALUES (100,20100);

INSERT INTO accounts (account_no,balance)
VALUES (200,10100);
Code language: SQL (Structured Query Language) (sql)

Tercero, consulta los datos de las accounts tabla:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Cuarto, transfiera 1000 de la cuenta 100 a la 200 y registre los cambios en la tabla account_changes en una sola transacción.

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 1000
 WHERE account_no = 100;

UPDATE accounts
   SET balance = balance + 1000
 WHERE account_no = 200;
 
INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',1000,datetime('now'));

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(200,'+',1000,datetime('now'));

COMMIT;Code language: SQL (Structured Query Language) (sql)

Quinto, consulta los datos de las accounts tabla:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Como puede ver, los saldos se han actualizado correctamente.

Sexto, consulte el contenido de account_changes tabla:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Tomemos otro ejemplo de retroceder una transacción.

Primero, intente deducir 20 000 de la cuenta 100:

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 20000
 WHERE account_no = 100;

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',20000,datetime('now'));Code language: SQL (Structured Query Language) (sql)

SQLite emitió un error debido a que no había suficiente saldo:

[SQLITE_CONSTRAINT]  Abort due to constraint violation (CHECK constraint failed: accounts)Code language: CSS (css)

Sin embargo, el registro se guardó en account_changes tabla:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

En segundo lugar, retroceda la transacción utilizando ROLLBACK declaración:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

Finalmente, consulte los datos de account_changes table, verás que el cambio nº 3 ya no está:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

En este tutorial, aprendió cómo manejar las transacciones de SQLite usando BEGIN TRANSACTION , COMMIT y ROLLBACK instrucciones para controlar las transacciones en la base de datos SQLite.