Резюме :в този урок ще ви покажем как да използвате транзакцията SQLite, за да гарантирате целостта и надеждността на данните.
SQLite &ACID
SQLite е транзакционна база данни, в която всички промени и заявки са атомарни, последователни, изолирани и издръжливи (ACID).
SQLite гарантира, че всички транзакции са съвместими с ACID, дори ако транзакцията е прекъсната от програмен срив, изхвърляне на операционна система или прекъсване на захранването на компютъра.
- A tomic:транзакцията трябва да бъде атомна. Това означава, че промяната не може да бъде разделена на по-малки. Когато извършите транзакция, се прилага или цялата транзакция, или не.
- C постоянен:транзакцията трябва да гарантира промяна на базата данни от едно валидно състояние в друго. Когато транзакция стартира и изпълни оператор за промяна на данни, базата данни става непоследователна. Въпреки това, когато транзакцията е ангажирана или отменена, важно е транзакцията да поддържа базата данни последователна.
- I Solation:чакаща транзакция, извършена от сесия, трябва да бъде изолирана от други сесии. Когато сесия стартира транзакция и изпълнява
INSERT
илиUPDATE
изявление за промяна на данните, тези промени са видими само за текущата сесия, но не и за други. От друга страна, промените, извършени от други сесии след стартиране на транзакцията, не трябва да се виждат от текущата сесия. - Издръжлив:ако транзакцията е успешно ангажирана, промените трябва да са постоянни в базата данни, независимо от условието като прекъсване на захранването или срив на програмата. Напротив, ако програмата се срине преди транзакцията да бъде завършена, промяната не трябва да продължи.
Изявления за транзакции в SQLite
По подразбиране SQLite работи в режим на автоматично записване. Това означава, че за всяка команда SQLite стартира, обработва и записва транзакцията автоматично.
За да стартирате транзакция изрично, използвайте следните стъпки:
Първо отворете транзакция, като издадете BEGIN TRANSACTION
команда.
BEGIN TRANSACTION;
Code language: SQL (Structured Query Language) (sql)
След изпълнение на оператора BEGIN TRANSACTION
, транзакцията е отворена, докато не бъде изрично ангажирана или отменена.
Второ, издавайте SQL оператори, за да изберете или актуализирате данни в базата данни. Имайте предвид, че промяната е видима само за текущата сесия (или клиента).
Трето, запишете промените в базата данни, като използвате COMMIT
или COMMIT TRANSACTION
изявление.
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Ако не искате да запазите промените, можете да върнете назад, като използвате ROLLBACK
или ROLLBACK TRANSACTION
изявление:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
Пример за транзакция в SQLite
Ще създадем две нови таблици:accounts
и account_changes
за демонстрацията.
accounts
таблицата съхранява данни за номерата на сметките и техните салда. account_changes
таблицата съхранява промените в сметките.
Първо създайте accounts
и account_changes
таблици, като използвате следния CREATE TABLE
изявления:
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)
Второ, поставете някои примерни данни в accounts
таблица.
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)
Трето, потърсете данни от accounts
таблица:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Четвърто, прехвърлете 1000 от сметка 100 към 200 и регистрирайте промените в таблицата account_changes
в една транзакция.
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)
Пето, потърсете данни от accounts
таблица:
SELECT * FROM accounts;
Code language: SQL (Structured Query Language) (sql)
Както можете да видите, балансите са актуализирани успешно.
Шесто, потърсете съдържанието на account_changes
таблица:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Нека вземем друг пример за връщане назад на транзакция.
Първо, опитайте да приспаднете 20 000 от сметка 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 издаде грешка поради недостатъчен баланс:
[SQLITE_CONSTRAINT] Abort due to constraint violation (CHECK constraint failed: accounts)
Code language: CSS (css)
Регистърът обаче е запазен в account_changes
таблица:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
Второ, върнете транзакцията назад, като използвате ROLLBACK
изявление:
ROLLBACK;
Code language: SQL (Structured Query Language) (sql)
И накрая, потърсете данни от account_changes
таблица, ще видите, че промяната № 3 вече не е там:
SELECT * FROM account_changes;
Code language: SQL (Structured Query Language) (sql)
В този урок научихте как да се справяте със SQLite транзакции, като използвате BEGIN TRANSACTION
, COMMIT
и ROLLBACK
оператори за управление на транзакциите в базата данни на SQLite.