SQLite Транзакция
Транзакция — это единица работы, выполняемая над базой данных. Транзакция — это единица или последовательность работы, выполняемая в логическом порядке, которая может быть выполнена вручную пользователем или автоматически программой базы данных.
Транзакция — это расширение, которое изменяет базу данных один или несколько раз. Например, если вы создаёте запись, обновляете запись или удаляете запись из таблицы, то вы выполняете транзакцию над этой таблицей. Важно контролировать транзакции, чтобы обеспечить целостность данных и обрабатывать ошибки базы данных.
Фактически, вы можете объединить множество запросов SQLite в группу и выполнить их все вместе как часть транзакции.
Свойства транзакции
Транзакции обладают следующими четырьмя стандартными свойствами, обычно обозначаемыми аббревиатурой ACID:
Атомарность:Гарантирует, что все операции внутри единицы работы успешно завершаются; в противном случае транзакция завершается при сбое, а предыдущие операции откатываются к предыдущему состоянию.
Согласованность:Гарантирует, что база данных правильно изменяет состояние при успешно зафиксированной транзакции.
Изоляция:Делает операции транзакций независимыми и прозрачными друг для друга.
Долговечность:Гарантирует, что результаты или эффекты зафиксированной транзакции сохраняются даже в случае системного сбоя.
Управление транзакциями
Используйте следующие команды для управления транзакциями:
BEGIN TRANSACTION: Начать обработку транзакции.
COMMIT: Сохранить изменения, или можно использовать командуEND TRANSACTION.
ROLLBACK: Откатить внесенные изменения.
Команды управления транзакциями используются только с командами DML INSERT, UPDATE и DELETE. Их нельзя использовать при создании или удалении таблиц, поскольку эти операции автоматически фиксируются в базе данных.
Команда BEGIN TRANSACTION
Транзакцию можно начать с помощью команды BEGIN TRANSACTION или просто команды BEGIN. Такие транзакции обычно продолжают выполняться до тех пор, пока не встретится следующая команда COMMIT или ROLLBACK. Однако при закрытии базы данных или возникновении ошибки также будет выполнен откат обработки транзакции. Ниже приведен простой синтаксис начала транзакции:
BEGIN; or BEGIN TRANSACTION;
Команда COMMIT
Команда COMMIT — это команда транзакции, используемая для сохранения в базе данных изменений, вызванных транзакцией.
Команда COMMIT сохраняет в базе данных все транзакции с момента последней команды COMMIT или ROLLBACK.
Синтаксис команды COMMIT выглядит следующим образом:
COMMIT; or END TRANSACTION;
Команда ROLLBACK
Команда ROLLBACK — это команда транзакции, используемая для отмены транзакций, которые еще не были сохранены в базе данных.
Команда ROLLBACK может использоваться только для отмены транзакций с момента выдачи последней команды COMMIT или ROLLBACK.
Синтаксис команды ROLLBACK выглядит следующим образом:
ROLLBACK;
Примеры
Предположим, таблица COMPANY содержит следующие записи:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
Теперь давайте начнем транзакцию и удалим из таблицы записи с age = 25. Наконец, мы используем команду ROLLBACK, чтобы отменить все изменения.
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK;
Проверьте таблицу COMPANY, в ней всё ещё есть следующие записи:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
Теперь давайте начнем еще одну транзакцию, удалим из таблицы записи с age = 25, и наконец мы используем команду COMMIT, чтобы зафиксировать все изменения.
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT;
Проверьте таблицу COMPANY, в ней есть следующие записи:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0Другие расширения