繁体   English   中英

sqlite 数据库被锁定异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM