C# Sqlite多线程操作 【database is locked】问题

helloWorld1209 2017-03-09 10:47:57
1. 程序中用到了多线程访问数据库去读写。

数据库执行代码如下:


private static void ExecuteNonQuery(string sql)
{
using (var connection = new SQLiteConnection(connectionStr))
{
connection.Open();

using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
command.ExecuteNonQuery();
}
}
}



System.Data.SQLite.SQLiteException (0x80004005): database is locked
database is locked
在 System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
在 System.Data.SQLite.SQLiteDataReader.NextResult()
在 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
在 System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
在 System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
在 System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
在 YSPRtxMsgMonitor.Helpers.DbHelper.ExecuteNonQuery(String sql)
在 YSPRtxMsgMonitor.Helpers.DbHelper.LogText(String text)


请指点,谢谢
...全文
732 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloWorld1209 2017-03-09
  • 打赏
  • 举报
回复
引用 5 楼 wddw1986 的回复:
[quote=引用 4 楼 jimmy_xiao0010 的回复:] [quote=引用 2 楼 xian_wwq 的回复:] 既然是多线程,就得考虑数据同步的问题 SQLite返回SQLITE_BUSY主要有以下几种情况: 1。当有写操作时,其他读操作会被驳回 2。当有写操作时,其他写操作会被驳回 3。当开启事务时,在提交事务之前,其他写操作会被驳回 4。当开启事务时,在提交事务之前,其他事务请求会被驳回 5。当有读操作时,其他写操作会被驳回 6。读操作之间能够并发执行 ... 加上读写锁吧
看大家评论,看来sqlite不支持多线程并发,其实我在关键得逻辑代码里已经用lock去控制了,但是看样子是有漏洞,没有完全lock住,这个异常不是一直出现的,偶发的。[/quote] 正常的做法是弄一个GetSQLConnection的方法,再这个方法里面做控制,防止并发[/quote] 谢谢指点,那connnection是每次都new一个还是一个实例不关闭?
cheng2005 2017-03-09
  • 打赏
  • 举报
回复
引用 4 楼 jimmy_xiao0010 的回复:
[quote=引用 2 楼 xian_wwq 的回复:] 既然是多线程,就得考虑数据同步的问题 SQLite返回SQLITE_BUSY主要有以下几种情况: 1。当有写操作时,其他读操作会被驳回 2。当有写操作时,其他写操作会被驳回 3。当开启事务时,在提交事务之前,其他写操作会被驳回 4。当开启事务时,在提交事务之前,其他事务请求会被驳回 5。当有读操作时,其他写操作会被驳回 6。读操作之间能够并发执行 ... 加上读写锁吧
看大家评论,看来sqlite不支持多线程并发,其实我在关键得逻辑代码里已经用lock去控制了,但是看样子是有漏洞,没有完全lock住,这个异常不是一直出现的,偶发的。[/quote] 正常的做法是弄一个GetSQLConnection的方法,再这个方法里面做控制,防止并发
helloWorld1209 2017-03-09
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
既然是多线程,就得考虑数据同步的问题 SQLite返回SQLITE_BUSY主要有以下几种情况: 1。当有写操作时,其他读操作会被驳回 2。当有写操作时,其他写操作会被驳回 3。当开启事务时,在提交事务之前,其他写操作会被驳回 4。当开启事务时,在提交事务之前,其他事务请求会被驳回 5。当有读操作时,其他写操作会被驳回 6。读操作之间能够并发执行 ... 加上读写锁吧
看大家评论,看来sqlite不支持多线程并发,其实我在关键得逻辑代码里已经用lock去控制了,但是看样子是有漏洞,没有完全lock住,这个异常不是一直出现的,偶发的。
cheng2005 2017-03-09
  • 打赏
  • 举报
回复
Sqlite是基于文件的数据库,说白了就是不能多个连接同时访问。 所以,用Sqlite你要自己做好连接的控制。避免并发访问。
xian_wwq 2017-03-09
  • 打赏
  • 举报
回复
既然是多线程,就得考虑数据同步的问题 SQLite返回SQLITE_BUSY主要有以下几种情况: 1。当有写操作时,其他读操作会被驳回 2。当有写操作时,其他写操作会被驳回 3。当开启事务时,在提交事务之前,其他写操作会被驳回 4。当开启事务时,在提交事务之前,其他事务请求会被驳回 5。当有读操作时,其他写操作会被驳回 6。读操作之间能够并发执行 ... 加上读写锁吧
Poopaye 2017-03-09
  • 打赏
  • 举报
回复
你知道lite是什么含义么

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧