![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Все чтения или записи происходят в транзакции.
Любая команда, которая получает доступ к базе данных (в основном, любая
команда SQL, кроме нескольких PRAGMA)
автоматически начинает транзакцию, если вы еще не сделали этого.
Автоматически начатые транзакции передаются, когда последний
SQL-оператор заканчивается. Транзакции могут быть начаты, вручную используя команду BEGIN.
Такие транзакции обычно сохраняются до следующего COMMIT или ROLLBACK.
Но транзакция будет также ROLLBACK, если база данных будет закрыта или если
ошибка происходит, и алгоритм разрешения конфликтов ROLLBACK определяется.
См. документацию относительно ON CONFLICT
для получения дополнительной информации об алгоритме
разрешения конфликтов ROLLBACK. END TRANSACTION это псевдоним для COMMIT. Транзакции, созданные, используя BEGIN... COMMIT, не вкладываются.
Для вложенных транзакций используйте команды
SAVEPOINT и
RELEASE. "TO SAVEPOINT
name" в ROLLBACK,
показанной в диаграмме синтаксиса выше, применим только к транзакциям
SAVEPOINT.
Попытка вызвать команду BEGIN в транзакции потерпит неудачу с ошибкой,
независимо от того, была ли транзакция начата
SAVEPOINT или BEGIN.
COMMIT и ROLLBACK без TO работают на транзакциях
SAVEPOINT, также, как
на транзакциях BEGIN. SQLite поддерживает многократные одновременные транзакции чтения,
прибывающие из отдельных соединений с базой данных, возможно в отдельных
потоках или процессах, но только одну одновременную транзакцию записи. Транзакции чтения используются только для чтения.
Транзакция записи позволяет чтение и запись.
Транзакция начата оператором SELECT, и транзакция записи начата
CREATE, DELETE, DROP, INSERT или UPDATE. Если запрос записи происходит в то
время, как транзакция чтения активна, то она модернизирована до транзакции
записи, если это возможно. Если некоторое другое соединение с базой данных
уже изменило базу данных или находится в процессе изменения базы данных, то
модернизация до транзакции записи невозможна, и операция записи
потерпит неудачу с SQLITE_BUSY. В то время как транзакция чтения активна, любые изменения базы данных,
которые осуществляются отдельными соединениями с базой данных, не будут
замечены соединением с базой данных, которое начало транзакцию чтения.
Если соединение с базой данных X держит транзакцию чтения, возможно, что
некоторое другое соединение с базой данных Y могло бы изменить содержание
базы данных, в то время как транзакция X все еще открыта, однако X не будет в
состоянии видеть те изменения, пока транзакция не заканчивается.
В то время как его транзакция чтения активна, X продолжит видеть
исторический снимок базы данных до изменений, осуществленных Y. Транзакции могут быть DEFERRED, IMMEDIATE или EXCLUSIVE.
Операционное поведение по умолчанию DEFERRED. DEFERRED означает, что транзакция на самом деле не начинается, пока к базе
данных сначала не получают доступ. Внутренне BEGIN DEFERRED
просто устанавливает флаг на соединении с базой данных, который выключает
автоматический commit, который обычно происходил бы, когда последний
запрос заканчивается. Это вызывает транзакцию, которая автоматически начата,
чтобы сохраниться до явного COMMIT или ROLLBACK или пока обратная перемотка
не вызывается ошибкой или ON CONFLICT в ROLLBACK. Если первый запрос
после BEGIN DEFERRED это SELECT, то транзакция чтения запускается.
Последующие запросы записи модернизируют транзакцию
до транзакции записи, если это возможно, или возвращают SQLITE_BUSY.
Если первый запрос после BEGIN DEFERRED это запрос записи, то
транзакция записи начата. IMMEDIATE заставляет соединение с базой данных начинать новую запись
немедленно, не ожидая запроса записи. IMMEDIATE BEGIN мог бы потерпеть
неудачу с SQLITE_BUSY, если другая транзакция
записи уже активна на другом соединении с базой данных. EXCLUSIVE подобен IMMEDIATE, в котором транзакция записи немедленно
начата. EXCLUSIVE и IMMEDIATE это то же самое в
режиме WAL, но в других режимах журналирования
EXCLUSIVE препятствует тому, чтобы другие соединения с базой данных читали
базу данных, в то время как транзакция идет. Неявная транзакция (транзакция, которая начата автоматически, не
транзакция, начатая BEGIN) передается автоматически, когда последний активный
запрос заканчивается. Запрос заканчивается, когда его последний курсор
закрывается, что, как гарантируют, произойдет, когда подготовленный запрос
будет reset или
finalized.
Некоторые запросы могли бы "закончиться" в целях управления
транзакциями до того, чтобы быть перезагруженным или завершенным, но нет
никакой гарантии этого. Единственный способ гарантировать, что запрос
завершен состоит в том, чтобы вызвать
sqlite3_reset() или
sqlite3_finalize().
Открытый sqlite3_blob,
используемый для возрастающего BLOB I/O, также считается незаконченным
запросом. sqlite3_blob заканчивается, когда он
закрыт. Явная команда COMMIT немедленно работает, даже если там ожидают
SELECT.
Однако, если там будут ожидать операции записи, команда COMMIT отвалится
с кодом ошибки SQLITE_BUSY. Попытка выполнить COMMIT могла бы также привести к коду возврата
SQLITE_BUSY, если у другого потока
или процесса есть открытая связь чтения.
Когда COMMIT терпит неудачу таким образом, транзакция остается активной, и
COMMIT может быть повторен позже после того, как у читателя
был шанс очиститься. В очень старых версиях SQLite (перед версией 3.7.11 - 2012-03-20)
ROLLBACK отвалится с кодом ошибки
SQLITE_BUSY,
если будут какие-либо надвигающиеся запросы. В более свежих версиях
SQLite продолжится ROLLBACK, и надвигающиеся запросы
будут часто прерываться, заставляя их возвратить
SQLITE_ABORT или
SQLITE_ABORT_ROLLBACK.
В SQLite version 3.8.8 (2015-01-16) и позже
чтение продолжит функционировать после ROLLBACK, пока ROLLBACK
не изменяет схему базы данных. Если PRAGMA journal_mode
= OFF (таким образом отключая файл журнала обратной перемотки),
поведение ROLLBACK не определено. Если определенные виды ошибок происходят в транзакции, транзакция
может или не может быть отменена автоматически. Ошибки, которые могут вызвать
автоматический откат, включают: Для всех этих ошибок SQLite пытается отменить просто один запрос, это
продолжает работать, и изменения из предшествующих запросов в той же самой
неповрежденной транзакции никуда не денутся.
Однако, в зависимости от оцениваемого запроса
и пункта, в котором происходит ошибка, могло бы быть необходимо для SQLite
отменить всю транзакцию. Применение может сказать, какой план действий SQLite
взял при помощи
sqlite3_get_autocommit(). Рекомендуется, чтобы запросы ответили на ошибки, упомянутые выше явно,
выпустив ROLLBACK. Если транзакция была уже отменена автоматически, ROLLBACK
потерпит неудачу с ошибкой, но никакой ущерб не нанесен этим. Будущие версии SQLite могут расширить список ошибок, которые могли бы
вызвать автоматическую отмену транзакции. Будущие версии SQLite могли бы
изменить ошибочный ответ. В частности мы можем упростить интерфейс в будущих
версиях SQLite, заставив ошибки выше вызывать безоговорочную отмену.
Choose any three.
1.
Синтаксис управления транзакциями
2. Транзакции
2.1. Транзакции чтения и записи
2.2. DEFERRED, IMMEDIATE и EXCLUSIVE
2.3. Implicit и explicit
3.
Ответ на ошибки в транзакции