Shrnutí :v tomto tutoriálu vám ukážeme, jak používat transakci SQLite k zajištění integrity a spolehlivosti dat.
SQLite &ACID
SQLite je transakční databáze, ve které jsou všechny změny a dotazy atomické, konzistentní, izolované a trvanlivé (ACID).
SQLite zaručuje, že všechny transakce jsou v souladu s ACID, i když je transakce přerušena pádem programu, výpisem stavu operačního systému nebo výpadkem napájení počítače.
- A tomic:transakce by měla být atomická. Znamená to, že změnu nelze rozdělit na menší. Když potvrdíte transakci, buď se použije celá transakce, nebo ne.
- C onsistent:transakce musí zajistit změnu databáze z jednoho platného stavu do jiného. Když se transakce spustí a provede příkaz k úpravě dat, databáze se stane nekonzistentní. Když je však transakce potvrzena nebo vrácena zpět, je důležité, aby transakce udržovala databázi konzistentní.
- Já Solation:čekající transakce provedená relací musí být izolována od ostatních relací. Když relace zahájí transakci a provede
INSERT
neboUPDATE
příkaz ke změně dat, tyto změny jsou viditelné pouze pro aktuální relaci, nikoli pro ostatní. Na druhou stranu změny provedené jinými relacemi po zahájení transakce by neměly být viditelné pro aktuální relaci. - Trvalá:pokud je transakce úspěšně potvrzena, musí být změny v databázi trvalé bez ohledu na podmínky, jako je výpadek napájení nebo selhání programu. Naopak, pokud se program zhroutí před potvrzením transakce, změna by neměla přetrvávat.
Příkazy transakcí SQLite
Ve výchozím nastavení SQLite pracuje v režimu automatického potvrzení. Znamená to, že pro každý příkaz SQLite automaticky spustí, zpracuje a potvrdí transakci.
Chcete-li zahájit transakci explicitně, použijte následující kroky:
Nejprve otevřete transakci vydáním BEGIN TRANSACTION
příkaz.
BEGIN TRANSACTION;
Code language: SQL (Structured Query Language) (sql)
Po provedení příkazu BEGIN TRANSACTION
, transakce je otevřená, dokud není výslovně potvrzena nebo vrácena zpět.
Zadruhé zadejte příkazy SQL pro výběr nebo aktualizaci dat v databázi. Pamatujte, že změna je viditelná pouze pro aktuální relaci (nebo klienta).
Za třetí, potvrďte změny v databázi pomocí COMMIT
nebo COMMIT TRANSACTION
prohlášení.
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Pokud změny uložit nechcete, můžete se vrátit zpět pomocí ROLLBACK
nebo ROLLBACK TRANSACTION
prohlášení:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
Příklad transakce SQLite
Vytvoříme dvě nové tabulky:accounts
a account_changes
pro demonstraci.
accounts
tabulka ukládá údaje o číslech účtů a jejich zůstatcích. account_changes
tabulka ukládá změny účtů.
Nejprve vytvořte accounts
a account_changes
tabulky pomocí následujícího CREATE TABLE
prohlášení:
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)
Za druhé, vložte některá ukázková data do accounts
tabulka.
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)
Za třetí, dotazujte se na data z accounts
tabulka:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Za čtvrté, převeďte 1000 z účtu 100 na 200 a zaznamenejte změny do tabulky account_changes
v jedné transakci.
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)
Za páté, dotazujte se na data z accounts
tabulka:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Jak můžete vidět, zůstatky byly úspěšně aktualizovány.
Za šesté, dotazujte se na obsah account_changes
tabulka:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Vezměme si další příklad vrácení transakce.
Nejprve se pokuste odečíst 20 000 z účtu 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 ohlásil chybu kvůli nedostatečnému zůstatku:
[SQLITE_CONSTRAINT] Abort due to constraint violation (CHECK constraint failed: accounts)
Code language: CSS (css)
Protokol byl uložen do account_changes
tabulka:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Za druhé, vraťte transakci zpět pomocí ROLLBACK
prohlášení:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
Nakonec zadejte dotaz na data z account_changes
tabulky, uvidíte, že změna č. 3 už tam není:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
V tomto tutoriálu jste se naučili, jak zacházet s transakcemi SQLite pomocí BEGIN TRANSACTION
, COMMIT
a ROLLBACK
příkazy pro kontrolu transakcí v databázi SQLite.