Я использую System.Data.Sqlite для доступа к базе данных SQLite на С#. У меня есть запрос, который должен читать строки в таблице. При повторении строк и пока читатель открыт, необходимо выполнить определенные обновления SQL. Я запускаю исключение "база данных заблокировано".
В документации SQLite указано:
Когда процесс хочет прочитать из файла базы данных, он выполнил следующую последовательность шагов:
- Откройте файл базы данных и получите блокировку SHARED.
В документации далее говорится о блокировке "SHARED":
База данных может быть прочитана, но не записана. Любое количество процессов может удерживать блокировки SHARED одновременно, поэтому может быть много одновременных считывателей. Но никакому другому потоку или процессу не разрешено записывать в файл базы данных, пока активна одна или несколько блокировок SHARED.
В FAQ указано:
Несколько процессов могут одновременно открывать одну и ту же базу данных. Несколько процессов могут одновременно выполнять SELECT. Однако только один процесс может вносить изменения в базу данных в любой момент времени.
В книге Окончательное руководство по SQLite говорится:
... соединение может выбрать наличие уровня изоляции без чтения, используя read_uncommited прагма. Если для него установлено значение true, тогда соединение не будет помещать блокировки чтения в таблицы, которые он читает. Поэтому другой писатель может фактически изменить таблицу, поскольку соединение в режиме чтения-незамкнутого не может блокировать и не блокировать какие-либо другие соединения.
Я попытался установить прагму для чтения без фиксации в инструкции команды запроса SQL следующим образом:
PRAGMA read_uncommitted = 1;
SELECT Column1, Column2 FROM MyTable
Обновление SQL в том же потоке с использованием другого соединения по-прежнему не удалось с исключением "база данных заблокирована". Затем я попытался установить уровень изоляции, который будет считаться незафиксированным в экземпляре соединения. Все равно никаких изменений с тем же исключением.
Как я могу сделать, чтобы открытое устройство чтения данных перебирало строки в базе данных без блокировки базы данных, чтобы я мог выполнять обновления?
Update:
Оба ответа ниже работают. Однако я отказался от использования журнала отката по умолчанию в настоящее время, используя запись Write-Ahead Logging, которая обеспечивает улучшенные concurrency чтения и записи базы данных.