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