[英]sqlite database is locked exception
我正在使用 c# 应用程序并在服务器机器中将应用程序作为 Windows 服务运行。当我从客户端机器执行插入、更新删除操作时,它会引发数据库锁定错误,如下所示,
database is locked
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.SQLite.SQLiteTransaction.Commit()
下面是我的代码
public int ExecuteNonQuerySQL(SQLiteCommand cmd)
{
int ireturn = 0;
if (conn.State != ConnectionState.Open)
Open(DataFile);
using (SQLiteTransaction dbtrans = conn.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (cmd.Connection=conn)
{
cmd.CommandText =cmd.CommandText ;
cmd.Transaction = dbtrans;
ireturn = cmd.ExecuteNonQuery();
dbtrans.Commit();
cmd.Dispose();
}
}
}
请帮助我,我已经做了很多谷歌搜索,我必须找到一些解决方案来解决这个问题。 问候
从提供的代码看来,您没有关闭连接。
还要注意事实,不知道它是否与您的情况相关,如果您从多个线程对其进行操作, Sqlite
在支持并发inserts
方面不太好,有时 db 会锁定。
将创建 Connection 和 Command 对象的方式更改为更像这样: https ://stackoverflow.com/a/17592858/8479
确保您没有在与创建它的线程不同的线程上重新使用任何 Sqlite 对象。
只要您遵循这两个规则,Sqlite 通常在并发方面表现出色。
就我而言,关闭连接不是问题。 问题是我打开和关闭每个表的连接,尽管数据库是相同的。 所以不要在 SQlite 中为同一个数据库多次打开连接。
SQlite 不擅长处理这个问题。 因此,如果您负担不起该解决方案,最好使用 SQLServer 等服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.