SAVEPOINT отключает автокоммит на SQLite?

Похоже, что SAVEPOINT, выполненная с использованием rawQuery, не отключает автокоммит, но, очевидно, запускает транзакцию:

db.rawQuery("SAVEPOINT TEST01", null);
db.rawQuery("BEGIN TRANSACTION", null); //this will fail with transaction already started error message

Поэтому следующий скрипт sql не будет работать должным образом - каждая строка выполняется в отдельном rawQuery или скомпилированном SQLiteStatement

SAVEPOINT TEST01
INSERTS with potential constraint errors, data is already in the db after each insert so the ROLLBACK during error does nothing but fails with "Cannot perform this operation because there is no current transaction."
RELEASE TEST01

Кажется, что вставки должны выполняться внутри транзакции, запущенной явно, поэтому следующие строки будут работать как положено:

BEGIN
SAVEPOINT TEST01
INSERTS
RELEASE TEST01
COMMIT

Тот же сценарий sql работает на iOS без использования BEGIN/COMMIT и просмотра документации ( https://sqlite.org/lang_savepoint.html). У нас есть два предложения, в которых четко говорится, что BEGIN/COMMIT не требуются для внешних точек сохранения:

"...A SAVEPOINT can be started either within or outside of a BEGIN...COMMIT. When a SAVEPOINT is the outer-most savepoint and it is not within a BEGIN...COMMIT then the behavior is the same as BEGIN DEFERRED TRANSACTION..."

"...If a RELEASE command releases the outermost savepoint, so that the transaction stack becomes empty, then RELEASE is the same as COMMIT..."

0 ответов

Другие вопросы по тегам