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

StackOverflow https://stackoverflow.com/questions/2490432

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top