当我输入这个查询: 删除邮件中id = 71的所有邮件

SQLite返回以下错误:

SQL error: database is locked

我如何解锁数据库,以便这个查询将工作?


当前回答

一个老问题,有很多答案,这里是我最近遵循的步骤,阅读上面的答案,但在我的情况下,问题是由于cifs资源共享。这个病例以前没有报道过,希望能帮助到一些人。

检查java代码中没有任何连接是打开的。 使用lsof检查是否有其他进程正在使用您的SQLite db文件。 检查正在运行的jvm进程的用户所有者对该文件具有r/w权限。 尝试在连接开口上强制锁定模式 final SQLiteConfig config = new SQLiteConfig(); config.setReadOnly(假); config.setLockingMode (LockingMode.NORMAL); connection = DriverManager。getConnection (url, config.toProperties ());

如果您在NFS共享文件夹上使用SQLite db文件,请检查SQLite faq的这一点,并检查您的挂载配置选项,以确保避免锁定,如下所述:

//myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0

其他回答

我在使用Delphi和LiteDAC组件时得到了这个错误。 事实证明,它只发生在运行我的应用程序从Delphi IDE,如果连接属性设置为True的SQLite连接组件(在这种情况下TLiteConnection)。

我在一个场景中得到了这个错误,与这里描述的略有不同。

SQLite数据库位于由3个服务器共享的NFS文件系统上。在其中2个服务器上,我能够成功地对数据库运行查询,在第三个服务器上,我认为我得到了“数据库已锁定”消息。

第三台机器的问题是,在/var上没有剩余空间了。每次我试图在位于这个文件系统的任何SQLite数据库中运行查询时,我都得到了“数据库被锁定”的消息,并且在日志上出现了这个错误:

Aug 8 10:33:38 server01 kernel: lockd: cannot monitor 172.22.84.87

还有这个:

Aug 8 10:33:38 server01 rpc。statd[7430]: Failed to insert: writing /var/lib/nfs/statd/sm/other.server.name.com: No space left on device .日志含义 Aug 8 10:33:38 server01 rpc。statd[7430]: STAT_FAIL to server01 for SM_MON of 172.22.84.87

太空的情况处理好之后,一切都恢复正常了。

一个老问题,有很多答案,这里是我最近遵循的步骤,阅读上面的答案,但在我的情况下,问题是由于cifs资源共享。这个病例以前没有报道过,希望能帮助到一些人。

检查java代码中没有任何连接是打开的。 使用lsof检查是否有其他进程正在使用您的SQLite db文件。 检查正在运行的jvm进程的用户所有者对该文件具有r/w权限。 尝试在连接开口上强制锁定模式 final SQLiteConfig config = new SQLiteConfig(); config.setReadOnly(假); config.setLockingMode (LockingMode.NORMAL); connection = DriverManager。getConnection (url, config.toProperties ());

如果您在NFS共享文件夹上使用SQLite db文件,请检查SQLite faq的这一点,并检查您的挂载配置选项,以确保避免锁定,如下所述:

//myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0

我发现SQLite中锁的各种状态的文档非常有用。Michael,如果您可以执行读操作,但不能对数据库执行写操作,这意味着某个进程已经获得了数据库上的保留锁,但还没有执行写操作。如果你正在使用SQLite3,有一个叫做PENDING的新锁,不允许更多的进程连接,但现有的连接仍然可以执行读取,所以如果这是问题所在,你应该看看这个锁。

我在应用程序中有这样的问题,从2个连接访问SQLite -一个是只读的,第二个用于写入和读取。看起来这个只读连接阻止了第二个连接的写入。最后,需要在使用后立即完成或至少重置准备好的语句。直到准备语句被打开,导致数据库写入被阻塞。

别忘了打电话:

sqlite_reset(xxx);

or

sqlite_finalize(xxx);