как безопасно повторить непрозрачный запрос, когда sqlite3_exec возвращает SQLITE_BUSY?

109
13

Я запускаю запрос, который выглядит примерно так:

ATTACH 'db2' as db;
BEGIN TRANSACTION;
...
END TRANSACTION;

Я должен сделать это таким образом, потому что это ошибка для присоединения к транзакции.

Проблема возникает, если другое соединение уже запускает какой-либо запрос, когда выдается вышеупомянутый запрос. Тогда весь запрос окажется неудачным, возвращая SQLITE_BUSY.

Чтобы справиться с этим, я сплю некоторое время, а затем повторю транзакцию. Однако теперь я получаю сообщение об ошибке "Не удается привязать базу данных к транзакции". Почему это происходит? Удалось ли оригинальное прикрепление, несмотря на возвращение SQLITE_BUSY? Если да, то почему я не получил вместо этого "база данных db2"? Или предыдущая транзакция все еще открыта, несмотря на то, что SQLITE_BUSY был возвращен? Для меня это не имеет смысла, запрос не занят, поэтому транзакция не должна открываться. Но что еще может быть?

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

спросил(а) 2021-01-25T18:49:43+03:00 4 месяца, 4 недели назад
1
Решение
99

Я не понял, почему это происходит, но я обнаружил, что удовлетворительным решением является вызов sqlite3_close(), за которым следует sqlite3_open() после возвращения SQLITE_BUSY. Это избавляет от каких-либо выдающихся условий, в которые может произойти повторная попытка предыдущего запроса.

ответил(а) 2021-01-25T18:49:43+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема