NoneGo -sqlite3 с journal_mode=WAL выдает ошибку "база данных заблокирована"
На ходу я открываю базу данных sqlite3 с помощью модуля mattn/go-sqlite3. Я установил режим журналирования базы данных на WAL сразу после открытия, используя PRAGMA journal_mode=WAL.
Однако, если я пытаюсь открыть базу данных из второго процесса во время работы первого, второй не может открыть ее и вместо этого получает ошибку "база данных заблокирована". Это происходит, даже если я не совершал никаких транзакций.
Строка подключения, которую я использую:
"file:mydbfile.db?cache=shared&mode=rwc"
(Я собираюсь ответить на свой вопрос, так как отладка заняла много времени)
1 ответ
Если вы хотите включить journal_mode=WAL, вы должны добавить его в строку подключения:
"file:mydbfile.db?cache=shared&mode=rwc&_journal_mode=WAL"
В рамках открытия базы данных go-sqlite3 выполнит операторы PRAGMA, чтобы установить различные значения по умолчанию. Одним из этих значений по умолчанию является установка journal_mode=DELETE. Однако, если база данных открыта для другого процесса, режим нельзя изменить обратно на УДАЛИТЬ. Выполнение этого оператора завершается с ошибкой "база данных заблокирована", поэтому вы увидите, что операция открытия завершится с ошибкой.
Полный список параметров строки подключения приведен по адресу https://github.com/mattn/go-sqlite3