Как я могу справиться с потенциальным конфликтом между двумя отдельными потоками, обращающимися к одной и той же базе данных? - PullRequest
0 голосов
/ 22 марта 2010

ВОПРОС: Как я могу справиться с потенциальным конфликтом между двумя отдельными потоками, обращающимися к одной и той же базе данных Sqlite?

ПРЕДПОСЫЛКИ: У меня есть приложение C # Winforms, которое использует Sqlite через ADO.net. У меня есть ветка фонового рабочего в приложении winforms. Я заметил, что могу получить исключение, когда и основной поток, и фоновый рабочий поток пытаются обновить базу данных sqlite, то есть вызывают DBDataAdaptor.Update () ..

Так что мне интересно, что проверяет мой код (хотя и код основного потока и / или код, который выполняется в backgroundworker), чтобы обработать это изящно, либо путем проверки заранее, либо блокировкой до ОК, либо выдачей конкретной ошибки Я могу поймать ...

спасибо

1 Ответ

1 голос
/ 22 марта 2010

В sqlite вы можете настроить обратный вызов, который запускается при возникновении ошибки SQLITE_BUSY или SQLITE_IOERR_BLOCKED (см. http://www.sqlite.org/c3ref/busy_handler.html).

Поскольку большую часть времени вам нужно спать и повторять запрос при занятости, sqlite имеет встроенный обратный вызов, который делает именно это; читать на sqlite3_busy_timeout на http://www.sqlite.org/c3ref/busy_timeout.html.

...