sql >> Databáze >  >> RDS >> SQLite

SQLite transakce

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í.
  • Solation:čekající transakce provedená relací musí být izolována od ostatních relací. Když relace zahájí transakci a provede INSERT nebo UPDATE 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.


  1. Co je SQL?

  2. Jak funguje funkce LOCATE() v MySQL

  3. Vzdálený přístup k serveru MySQL přes tunel SSH

  4. Přesunout data SQL z jedné tabulky do druhé