SQLite
 sql >> Base de données >  >> RDS >> SQLite

Transaction SQLite

Résumé :dans ce tutoriel, nous allons vous montrer comment utiliser la transaction SQLite pour assurer l'intégrité et la fiabilité des données.

SQLite et ACID

SQLite est une base de données transactionnelle dans laquelle toutes les modifications et requêtes sont atomiques, cohérentes, isolées et durables (ACID).

SQLite garantit que toutes les transactions sont conformes à ACID même si la transaction est interrompue par un plantage du programme, un vidage du système d'exploitation ou une panne de courant de l'ordinateur.

  • Un tomic :une transaction doit être atomique. Cela signifie qu'un changement ne peut pas être décomposé en plus petits. Lorsque vous validez une transaction, la totalité de la transaction est appliquée ou non.
  • C onsistent :une transaction doit s'assurer de faire passer la base de données d'un état valide à un autre. Lorsqu'une transaction démarre et exécute une instruction pour modifier des données, la base de données devient incohérente. Cependant, lorsque la transaction est validée ou annulée, il est important que la transaction maintienne la cohérence de la base de données.
  • Je solation :une transaction en attente effectuée par une session doit être isolée des autres sessions. Lorsqu'une session démarre une transaction et exécute le INSERT ou UPDATE pour modifier les données, ces modifications ne sont visibles que pour la session en cours, pas pour les autres. D'autre part, les modifications validées par d'autres sessions après le démarrage de la transaction ne doivent pas être visibles pour la session en cours.
  • Durable :si une transaction est validée avec succès, les modifications doivent être permanentes dans la base de données, quelle que soit la condition telle qu'une panne de courant ou un plantage du programme. Au contraire, si le programme plante avant que la transaction ne soit validée, la modification ne devrait pas persister.

Instructions de transaction SQLite

Par défaut, SQLite fonctionne en mode auto-commit. Cela signifie que pour chaque commande, SQLite démarre, traite et valide automatiquement la transaction.

Pour démarrer explicitement une transaction, procédez comme suit :

Tout d'abord, ouvrez une transaction en émettant le BEGIN TRANSACTION commande.

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

Après avoir exécuté l'instruction BEGIN TRANSACTION , la transaction est ouverte jusqu'à ce qu'elle soit explicitement validée ou annulée.

Deuxièmement, émettez des instructions SQL pour sélectionner ou mettre à jour des données dans la base de données. Notez que la modification n'est visible que pour la session (ou le client) en cours.

Troisièmement, validez les modifications apportées à la base de données en utilisant le COMMIT ou COMMIT TRANSACTION déclaration.

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

Si vous ne souhaitez pas enregistrer les modifications, vous pouvez revenir en arrière en utilisant le ROLLBACK ou ROLLBACK TRANSACTION déclaration :

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

Exemple de transaction SQLite

Nous allons créer deux nouvelles tables :accounts et account_changes pour la démonstration.

Les accounts table stocke des données sur les numéros de compte et leurs soldes. Les account_changes table stocke les modifications des comptes.

Commencez par créer les accounts et account_changes tables en utilisant le CREATE TABLE suivant déclarations :

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)

Deuxièmement, insérez des exemples de données dans les accounts tableau.

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)

Troisièmement, interrogez les données des accounts tableau :

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

Quatrièmement, transférez 1 000 du compte 100 au compte 200 et consignez les modifications dans la table account_changes en une seule transaction.

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)

Cinquièmement, interrogez les données des accounts tableau :

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

Comme vous pouvez le voir, les soldes ont été mis à jour avec succès.

Sixièmement, interrogez le contenu de account_changes tableau :

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

Prenons un autre exemple d'annulation d'une transaction.

Essayez d'abord de déduire 20 000 du compte 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 a émis une erreur en raison d'un solde insuffisant :

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

Cependant, le journal a été enregistré dans le account_changes tableau :

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

Ensuite, annulez la transaction en utilisant le ROLLBACK déclaration :

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

Enfin, interrogez les données de account_changes tableau, vous verrez que le changement n°3 n'y est plus :

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

Dans ce didacticiel, vous avez appris à gérer les transactions SQLite en utilisant le BEGIN TRANSACTION , COMMIT , et ROLLBACK instructions pour contrôler les transactions dans la base de données SQLite.