#c# #multithreading #sqlite
#c# #многопоточность #sqlite
Вопрос:
Я разрабатываю приложение на c # с внутренней базой данных sqlite. В моем приложении используются многопоточные концепции. Все потоки будут вызывать приведенный ниже код. затем он выдаст ошибку, поскольку база данных заблокирована.
lock (localLockHandle)
{
SQLiteCommand cmd = conn.CreateCommand();
cmd.CommandText = sqlExpr;
int ireturn = cmd.ExecuteNonQuery();
return ireturn;
}
Есть ли какой-либо способ избавиться от этой ошибки блокировки базы данных. я открываю и закрываю соединение после каждого процесса. даже иногда он выдает эту ошибку блокировки. пожалуйста, дайте мне решение, поскольку это очень важно для меня.
Спасибо
Комментарии:
1. Я считаю, что применение блокировки в этот момент действительно ничего не даст. На мой взгляд, в какой-то момент вы выполняете запрос, который блокирует базу данных. Это сам запрос, а не команда SQLLiteCommand. Попытайтесь выяснить, какой запрос вы выполняли последним перед блокировкой базы данных.
Ответ №1:
Если я правильно понимаю ваш фрагмент кода, вы используете lock
для объекта в локальной области видимости. Это означало бы, что другие потоки будут lock
работать с другим объектом.
Попробуйте определить глобальную блокировку, например:
static readonly object DatabaseLock = new object()
а затем используйте lock(DatabaseLock)
везде, где вы обращаетесь к базе данных.