SQLite
 sql >> база данни >  >> RDS >> SQLite

SQLite транзакция

Резюме :в този урок ще ви покажем как да използвате транзакцията 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване в базата данни SQLite android

  2. пагинация в списъка

  3. данните, заредени от SQLitE databse, не се записват в моделния клас ArrayList android

  4. Как да отрежете низ в SQLite

  5. 2 начина за връщане само на числовите стойности от колона на базата данни на SQLite