sqlite - как я могу справиться с потенциальным конфликтом между двумя отдельными потоками, обращающимися к одной и той же базе данных?
-
21-09-2019 - |
Вопрос
ВОПРОС:Как я могу справиться с потенциальным конфликтом между двумя отдельными потоками, обращающимися к одной и той же базе данных Sqlite?
ПРЕДЫСТОРИЯ:У меня есть приложение C # Winforms, которое использует Sqlite через ADO.net .У меня действительно есть поток backgroundworker в приложении winforms.Я заметил, что я могу получить исключение, когда и основной поток, и фоновый рабочий поток пытаются обновить базу данных sqlite, т. е.вызов DBDataAdaptor.Обновить()..
Итак, меня интересует, что проверяет мой код (хотя и код основного потока и / или код, который выполняется в backgroundworker), чтобы справиться с этим изящно, либо с помощью предварительной проверки, либо блокируя до тех пор, пока все не будет в порядке, либо вызывая конкретную ошибку, которую я могу поймать...
Спасибо
Решение
В sqlite вы можете настроить обратный вызов, который запускается, когда вы сталкиваетесь с SQLITE_BUSY
или SQLITE_IOERR_BLOCKED
ошибка (см. http://www.sqlite.org/c3ref/busy_handler.html).
Поскольку большую часть времени то, что вы хотели бы сделать, это перейти в режим ожидания и повторить запрос при busy , sqlite имеет встроенный обратный вызов, который делает именно это;читайте дальше sqlite3_busy_timeout
в http://www.sqlite.org/c3ref/busy_timeout.html.