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
ellerUPDATE
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.