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

SQLite-transaktion

Oversigt :i denne vejledning viser vi dig, hvordan du bruger SQLite-transaktionen til at sikre dataenes integritet og pålidelighed.

SQLite &ACID

SQLite er en transaktionsdatabase, hvor alle ændringer og forespørgsler er atomare, konsistente, isolerede og holdbare (ACID).

SQLite garanterer, at alle transaktioner er ACID-kompatible, selvom transaktionen afbrydes af et programnedbrud, operativsystemdump eller strømsvigt til computeren.

  • A tomisk:en transaktion skal være atomisk. Det betyder, at en ændring ikke kan opdeles i mindre. Når du foretager en transaktion, anvendes enten hele transaktionen eller ej.
  • C onsistent:en transaktion skal sikre at databasen ændres fra en gyldig tilstand til en anden. Når en transaktion starter og udfører en sætning for at ændre data, bliver databasen inkonsekvent. Men når transaktionen er forpligtet eller rullet tilbage, er det vigtigt, at transaktionen skal holde databasen konsistent.
  • I solation:en afventende transaktion udført af en session skal være isoleret fra andre sessioner. Når en session starter en transaktion og udfører INSERT eller UPDATE sætning for at ændre dataene, er disse ændringer kun synlige for den aktuelle session, ikke andre. På den anden side bør de ændringer, der er foretaget af andre sessioner, efter at transaktionen startede, ikke være synlige for den aktuelle session.
  • Vardig:Hvis en transaktion er gennemført, skal ændringerne være permanente i databasen uanset tilstanden såsom strømsvigt eller programnedbrud. Tværtimod, hvis programmet går ned, før transaktionen er begået, bør ændringen ikke fortsætte.

SQLite transaktionserklæringer

Som standard fungerer SQLite i auto-commit-tilstand. Det betyder, at for hver kommando starter, behandler og forpligter SQLite transaktionen automatisk.

For at starte en transaktion eksplicit skal du bruge følgende trin:

Åbn først en transaktion ved at udstede BEGIN TRANSACTION kommando.

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

Efter at have udført sætningen BEGIN TRANSACTION , er transaktionen åben, indtil den eksplicit er forpligtet eller rullet tilbage.

For det andet skal du udstede SQL-sætninger for at vælge eller opdatere data i databasen. Bemærk, at ændringen kun er synlig for den aktuelle session (eller klient).

For det tredje, overfør ændringerne til databasen ved at bruge COMMIT eller COMMIT TRANSACTION erklæring.

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

Hvis du ikke vil gemme ændringerne, kan du rulle tilbage ved at bruge ROLLBACK eller ROLLBACK TRANSACTION erklæring:

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

SQLite-transaktionseksempel

Vi vil oprette to nye tabeller:accounts og account_changes til demonstrationen.

accounts tabel gemmer data om kontonumre og deres saldi. account_changes tabel gemmer ændringerne af konti.

Først skal du oprette accounts og account_changes tabeller ved at bruge følgende CREATE TABLE udsagn:

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)

For det andet skal du indsætte nogle eksempeldata i accounts tabel.

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)

For det tredje, forespørg data fra accounts tabel:

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

For det fjerde, overfør 1000 fra konto 100 til 200, og log ændringerne i tabellen account_changes i en enkelt transaktion.

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)

For det femte, forespørg data fra accounts tabel:

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

Som du kan se, er saldi blevet opdateret med succes.

For det sjette skal du forespørge på indholdet af account_changes tabel:

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

Lad os tage et andet eksempel på at rulle en transaktion tilbage.

Forsøg først at trække 20.000 fra konto 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 udsendte en fejl på grund af ikke nok saldo:

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

Loggen er dog blevet gemt i account_changes tabel:

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

For det andet skal du rulle transaktionen tilbage ved at bruge ROLLBACK erklæring:

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

Til sidst skal du forespørge data fra account_changes tabel, vil du se, at ændring nr. 3 ikke er der længere:

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

I denne øvelse har du lært, hvordan du håndterer SQLite-transaktioner ved at bruge BEGIN TRANSACTION , COMMIT , og ROLLBACK sætninger til at kontrollere transaktionerne i SQLite-databasen.


  1. Implementering af personsøgning ved hjælp af OFFSET FETCH NEXT i SQL Server

  2. Hvilken objekttype returnerer Spring Hibernate Template-eksekveringsmetoden for en tælleforespørgsel på Oracle?

  3. Sådan implementeres Percona Server til MySQL for høj tilgængelighed

  4. Vælg rækker, der ikke er til stede i anden tabel