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