SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Transakcja SQLite

Podsumowanie :w tym samouczku pokażemy, jak korzystać z transakcji SQLite, aby zapewnić integralność i niezawodność danych.

SQLite i ACID

SQLite to transakcyjna baza danych, w której wszystkie zmiany i zapytania są niepodzielne, spójne, izolowane i trwałe (ACID).

SQLite gwarantuje, że wszystkie transakcje są zgodne z ACID, nawet jeśli transakcja zostanie przerwana przez awarię programu, zrzut systemu operacyjnego lub awarię zasilania komputera.

  • A tomic:transakcja powinna być niepodzielna. Oznacza to, że zmiany nie da się rozłożyć na mniejsze. Kiedy zatwierdzasz transakcję, albo cała transakcja jest stosowana, albo nie.
  • C onsistent:transakcja musi zapewniać zmianę bazy danych z jednego prawidłowego stanu na inny. Po rozpoczęciu transakcji i wykonaniu instrukcji modyfikacji danych baza danych staje się niespójna. Jednak gdy transakcja zostanie zatwierdzona lub wycofana, ważne jest, aby transakcja zapewniała spójność bazy danych.
  • Ja rozwiązanie:oczekująca transakcja wykonywana przez sesję musi być odizolowana od innych sesji. Kiedy sesja rozpoczyna transakcję i wykonuje INSERT lub UPDATE oświadczenie o zmianie danych, zmiany te są widoczne tylko dla bieżącej sesji, a nie dla innych. Z drugiej strony zmiany wprowadzone przez inne sesje po rozpoczęciu transakcji nie powinny być widoczne dla bieżącej sesji.
  • Trwałe:jeśli transakcja zostanie pomyślnie zatwierdzona, zmiany muszą być trwałe w bazie danych, niezależnie od warunków, takich jak awaria zasilania lub awaria programu. Wręcz przeciwnie, jeśli program ulegnie awarii przed zatwierdzeniem transakcji, zmiana nie powinna się utrzymywać.

Wyciągi transakcji SQLite

Domyślnie SQLite działa w trybie automatycznego zatwierdzania. Oznacza to, że dla każdego polecenia SQLite uruchamia się, przetwarza i zatwierdza transakcję automatycznie.

Aby jawnie rozpocząć transakcję, wykonaj następujące czynności:

Najpierw otwórz transakcję, wydając BEGIN TRANSACTION polecenie.

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

Po wykonaniu instrukcji BEGIN TRANSACTION , transakcja jest otwarta, dopóki nie zostanie jawnie zatwierdzona lub wycofana.

Po drugie, wydaj instrukcje SQL, aby wybrać lub zaktualizować dane w bazie danych. Zauważ, że zmiana jest widoczna tylko dla bieżącej sesji (lub klienta).

Po trzecie, zatwierdź zmiany w bazie danych za pomocą COMMIT lub COMMIT TRANSACTION oświadczenie.

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

Jeśli nie chcesz zapisywać zmian, możesz cofnąć za pomocą ROLLBACK lub ROLLBACK TRANSACTION oświadczenie:

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

Przykład transakcji SQLite

Stworzymy dwie nowe tabele:accounts i account_changes do demonstracji.

accounts tabela przechowuje dane o numerach rachunków i ich saldach. account_changes tabela przechowuje zmiany kont.

Najpierw utwórz accounts i account_changes tabele za pomocą następującego CREATE TABLE oświadczenia:

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)

Po drugie, wstaw przykładowe dane do accounts tabela.

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)

Po trzecie, zapytaj o dane z accounts tabela:

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

Po czwarte, przenieś 1000 z konta 100 na 200 i zapisz zmiany w tabeli account_changes w jednej transakcji.

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)

Po piąte, zapytaj o dane z accounts tabela:

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

Jak widać, salda zostały pomyślnie zaktualizowane.

Po szóste, zapytaj o zawartość account_changes tabela:

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

Weźmy kolejny przykład wycofania transakcji.

Najpierw spróbuj odliczyć 20 000 od konta 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 wysłał błąd z powodu niewystarczającego salda:

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

Dziennik został jednak zapisany w account_changes tabela:

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

Po drugie, wycofaj transakcję za pomocą ROLLBACK oświadczenie:

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

Na koniec zapytaj o dane z account_changes tabeli, zobaczysz, że zmiana nr 3 już nie istnieje:

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

W tym samouczku nauczyłeś się, jak radzić sobie z transakcjami SQLite za pomocą BEGIN TRANSACTION , COMMIT i ROLLBACK instrukcji do kontroli transakcji w bazie danych SQLite.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak nadać pozycji zero spinnera odpowiednią wartość?

  2. Konwertuj SQLite na JSON

  3. Zapisz dane w metodzie onDestroy aktywności

  4. Połącz SQLite Count() z GROUP BY, aby dodać kolumnę „Count” do zestawu wyników

  5. Android Room:jak przenieść zmianę nazwy kolumny?