SQLite
 sql >> Database >  >> RDS >> SQLite

Transazione SQLite

Riepilogo :in questo tutorial, ti mostreremo come utilizzare la transazione SQLite per garantire l'integrità e l'affidabilità dei dati.

SQLite e ACID

SQLite è un database transazionale in cui tutte le modifiche e le query sono atomiche, coerenti, isolate e durevoli (ACID).

SQLite garantisce che tutte le transazioni siano compatibili con ACID anche se la transazione viene interrotta da un arresto anomalo del programma, da un dump del sistema operativo o da un'interruzione di corrente del computer.

  • A tomic:una transazione dovrebbe essere atomica. Significa che un cambiamento non può essere scomposto in cambiamenti più piccoli. Quando esegui il commit di una transazione, l'intera transazione viene applicata o meno.
  • C onsistent:una transazione deve garantire il passaggio del database da uno stato valido all'altro. Quando una transazione inizia ed esegue un'istruzione per modificare i dati, il database diventa incoerente. Tuttavia, quando viene eseguito il commit o il rollback della transazione, è importante che la transazione mantenga il database coerente.
  • Io solation:una transazione in sospeso eseguita da una sessione deve essere isolata dalle altre sessioni. Quando una sessione avvia una transazione ed esegue INSERT o UPDATE dichiarazione per modificare i dati, queste modifiche sono visibili solo alla sessione corrente, non ad altre. D'altra parte, le modifiche apportate da altre sessioni dopo l'avvio della transazione non dovrebbero essere visibili alla sessione corrente.
  • Durevole:se una transazione viene eseguita correttamente, le modifiche devono essere permanenti nel database indipendentemente da condizioni quali interruzione di corrente o arresto anomalo del programma. Al contrario, se il programma si arresta in modo anomalo prima del commit della transazione, la modifica non dovrebbe persistere.

Istruzioni di transazione SQLite

Per impostazione predefinita, SQLite opera in modalità di commit automatico. Significa che per ogni comando, SQLite avvia, elabora e conferma automaticamente la transazione.

Per avviare una transazione in modo esplicito, utilizza i seguenti passaggi:

Innanzitutto, apri una transazione emettendo il BEGIN TRANSACTION comando.

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

Dopo aver eseguito l'istruzione BEGIN TRANSACTION , la transazione è aperta fino a quando non viene esplicitamente eseguito il commit o il rollback.

In secondo luogo, emettere istruzioni SQL per selezionare o aggiornare i dati nel database. Tieni presente che la modifica è visibile solo alla sessione (o client) corrente.

Terzo, salva le modifiche al database usando il COMMIT o COMMIT TRANSACTION dichiarazione.

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

Se non desideri salvare le modifiche, puoi eseguire il rollback utilizzando il ROLLBACK o ROLLBACK TRANSACTION dichiarazione:

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

Esempio di transazione SQLite

Creeremo due nuove tabelle:accounts e account_changes per la dimostrazione.

I accounts la tabella memorizza i dati sui numeri di conto e sui loro saldi. I account_changes la tabella memorizza le modifiche degli account.

Innanzitutto, crea gli accounts e account_changes tabelle utilizzando il seguente CREATE TABLE dichiarazioni:

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)

In secondo luogo, inserisci alcuni dati di esempio negli accounts tabella.

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)

Terzo, interroga i dati dagli accounts tabella:

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

In quarto luogo, trasferisci 1000 dall'account 100 a 200 e registra le modifiche nella tabella account_changes in un'unica transazione.

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, interroga i dati dagli accounts tabella:

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

Come puoi vedere, i saldi sono stati aggiornati con successo.

Sesto, interroga il contenuto di account_changes tabella:

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

Prendiamo un altro esempio di rollback di una transazione.

Innanzitutto, prova a detrarre 20.000 dall'account 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 ha emesso un errore a causa di un saldo insufficiente:

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

Tuttavia, il registro è stato salvato in account_changes tabella:

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

In secondo luogo, annulla la transazione utilizzando il ROLLBACK dichiarazione:

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

Infine, interroga i dati da account_changes tabella, vedrai che la modifica n. 3 non è più presente:

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

In questo tutorial, hai imparato a gestire le transazioni SQLite utilizzando BEGIN TRANSACTION , COMMIT e ROLLBACK istruzioni per controllare le transazioni nel database SQLite.