【发布时间】:2017-11-13 03:45:36
【问题描述】:
我正在开发一个使用 SQLite 的多线程 C# 程序。我遇到了一个问题,有时运行 SQLiteCommand.ExecuteNonQuery() 来更新某些行会抱怨“SQLite 错误 (5):数据库已锁定”。我知道发生这种情况是因为在进行插入或更新时数据库被锁定,所以如果另一个修改数据库的查询出现,第二个查询将导致这个数据库被锁定错误。所以我正在尝试对其实施解决方法,但我不确定我应该如何去做。
我试图做到这一点,以便如果引发数据库锁定错误,那么程序会稍等片刻,然后再试一次,直到它工作为止。但不知何故,没有任何异常被捕获,并且代码只是退出了 try-catch 块,即使数据库锁定消息仍然打印在调试输出中。我不完全确定 SQL 查询是被拒绝还是被接受。
我也尝试过使用 TransactionScope,从那以后我没有遇到过数据库被锁定的事情,但是由于问题的随机性,我不能 100% 确定 TransactionScope 是否真的解决了问题,或者它是否只是在一定程度上可以,或者如果没有,到目前为止我很幸运。
SQLiteConnection connection = new SQLiteConnection("Data Source=DB.db;Version=3;");
connection.Open();
SQLiteCommand command = connection.CreateCommand();
command.commandText = inputQuery;
try
{
command.executeNonQuery();
}
catch (SQLiteException sqle)
{
Debug.WriteLine("Database error: " + e.Message);
return false;
}
catch (Exception e)
{
Debug.WriteLine("Database error: " + e.Message);
return false;
}
finally
{
connection.Close();
}
所以我真的很想有人帮我找出 1)如何消除数据库被锁定的问题或 2)如何检测数据库是否被锁定错误发生。提前致谢。
【问题讨论】:
-
我建议使用生产者-消费者模式(使用合适的锁、同步原语或异步模式)在单个线程中执行所有 SQLite 操作。
-
谢谢。为了完全摆脱数据库锁定,这似乎是最安全的方法。
标签: c# database multithreading sqlite