【发布时间】:2021-10-22 14:54:45
【问题描述】:
我有一个在 RHEL 上运行的 .NET 服务器应用程序(别问...),使用 SQLite 作为内存数据库。
单个写入器线程正在使用具有外部数据的显式事务更新一堆表,然后在等待大约一秒钟后重复相同的操作。同时,我有一堆只读工作线程同时查询表中的数据。查询都运行得相当快(约 20 毫秒)。
所有线程/连接都使用相同的连接字符串:“Data Source=INTERNAL;Mode=Memory;Cache=Shared”,只读工作线程另外执行“PRAGMA query_only=true”。我试图确保所有命令/数据读取器都被一次性处理掉。
这大部分工作正常,但偶尔我在编写器线程中得到一个“Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite 错误 6: 数据库表已锁定”,似乎是 30 秒(默认?)当代码尝试使用 ExecuteNonQuery 运行 UPDATE 命令时超时。当它发生时,错误可能出现在事务中正在更新的任何表上。
抛出异常:
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at (my code)
在我看来,只读工作线程以某种方式设法创建锁(意外)并且不释放它们(?),然后使写入线程事务失败。在新事务中从同一写入线程对同一组表进行后续写入似乎也可以正常工作。
目前使用 Microsoft.Data.Sqlite 5.0.8 版
我可以做些什么来进一步调查或(甚至更好地)修复它?
【问题讨论】:
标签: c# multithreading sqlite sqlite-net