Я использую SQLite (System.Data.SQLite.dll) в многопоточной программе для Windows. Я использую этот код:Выполняется ли SQLiteConnection.BeginTransaction при блокировке базы данных?
using (var cn = new SQLiteConnection(connectionString))
{
cn.Open();
using (var tx = cn.BeginTransaction())
{
// do some work here
tx.Commit();
}
}
Я Подчеркивая программу, используя 8 параллельных потоков записи в базу данных одновременно. Иногда я вижу это сообщение в окне вывода Visual Studio:
SQLite error (517): statement aborts at 1: [BEGIN IMMEDIATE] database is locked
Но исключение не выбрасывается вообще, и все работает так, как ожидалось. Поэтому я думаю, что SQLConnection.BeginTrasaction() повторяет попытку, когда получает базу данных SQLite (517), заблокирована.
Я прав?
Если да, сколько раз SQLConnection.BeginTransaction повторяет попытку перед выбросом исключения. Это настраивается?
Спасибо, что объясняет вещи –
Что случилось с BusyTimout собственности? Будет ли это в следующей версии System.Data.SQLite ?. PRAGMA busy_timeout возвращает 0 в моей программе. Что здесь происходит? Использует ли System.Data.SQLite sqlite3_busy_handler https://www.sqlite.org/c3ref/busy_handler.html? –
Оказывается, он не указан внутри Sqlite.dll. Это было в другой библиотеке с открытым исходным кодом. Похоже, вы не можете явно установить его вообще: / –