Автоматический откат неявных транзакций для нескольких операторов? - PullRequest
1 голос
/ 16 апреля 2019

Когда несколько операторов передаются вместе - разделенные точками с запятой (;), но в одной строке - и НЕ заключаются в явную транзакцию, создается только одна неявная транзакция или неявная транзакция, созданная для каждой заявление отдельно? Кроме того, если один из более поздних операторов завершится неудачно и будет выполнен автоматический откат, все ли операторы будут откатаны?

Этот другой ответ почти удовлетворяет мой вопрос, но формулировка в официальной документации оставляет меня озадаченным. На самом деле, это может показаться дубликатом, но мне особенно интересно узнать о неявных транзакциях для нескольких операторов. Другой ответ явно не касается этого конкретного случая.

В качестве примера (заимствуя из другого вопроса), следующие строки представлены в виде одной строки:

INSERT INTO a (x, y) VALUES (0, 0);
INSERT INTO b (x, y) VALUES (1, 2); -- line 3 error here, b doesn't have column x

Документация говорит

Автоматически запускаемые транзакции фиксируются после завершения запроса last . (выделение добавлено)

и

Неявная транзакция (транзакция, которая запускается автоматически, а не транзакция, запущенная BEGIN) фиксируется автоматически после завершения оператора last active. Оператор заканчивается, когда его подготовленный оператор сбрасывается или завершается. (выделение добавлено)

Ключевое слово last подразумевает для меня возможность нескольких утверждений. Конечно, если неявная транзакция запускается для каждого отдельного оператора, то в отдельности каждый оператор будет «последним» оператором, который нужно выполнить, но в контексте отдельных операторов он должен просто сказать оператор , чтобы подчеркнуть контекст является одним оператором за раз.

Или есть разница между подготовленными операторами и неподготовленными строками SQL? (Но, как я понимаю, все операторы готовятся, даже если вызывающее приложение не сохраняет подготовленный оператор для повторного использования, поэтому я не уверен, что это даже имеет значение.)

В случае, если все операторы успешны, результат одного коммита или нескольких коммитов по существу одинаков, но в документах только упоминается, что один проваленный оператор автоматически откатывается, но не упоминаются другие операторы, представленные вместе. .

1 Ответ

1 голос
/ 16 апреля 2019

Интерфейс sqlite3_prepare компилирует оператор SQL first в строку запроса. Параметр pzTail для этих функций возвращает указатель на начало неиспользованной части строки запроса.

Например, если в вашем примере вы вызываете sqlite3_prepare со строкой SQL с несколькими операторами, то первая инструкция является единственной, которая активна для результирующей подготовленной инструкции . Указатель pzTail, если он указан, указывает на начало второго оператора. Второй оператор не будет скомпилирован как подготовленный оператор, пока вы снова не вызовете sqlite3_prepare с указателем pzTail.

Итак, нет, множественные операторы не откатываются. Каждая неявная транзакция, созданная механизмом SQLite, включает в себя один подготовленный оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...