Python,SQLite错误?数据库被锁定?但实际上并没有被锁定?

3
我在我的sqlite3数据库中遇到了“数据库表被锁定”的错误。我的脚本是单线程的,没有其他应用程序在使用该程序(我曾经在“SQLite Database Browser.exe”中打开过它)。我复制了文件,删除了原始文件(成功),并将副本重命名,以便我知道没有进程正在锁定它,但是当我运行我的脚本时,表B中的所有内容都无法写入,而表A看起来很好。发生了什么?
-编辑- 我已经解决了问题,但不确定如何解决。我注意到代码没有执行正确的操作(我复制了错误的字段),在修复和清理后,它神奇地重新开始工作。
-编辑2- 有人发布了,所以我也更新一下。我认为问题是我试图在使用命令/光标的情况下执行语句。

你能将你的代码简化为一个最小的不可工作的示例并发布吗? - nosklo
没有代码,我们无法理解你在说什么。顺便提一下,如果您的应用程序是多线程或创建子进程,请注明这一事实。 - S.Lott
4个回答

4

我之前也遇到过这个问题。当你打开游标和连接,然后程序在你正常关闭之前崩溃时,它经常会发生。在某些情况下,可以使用以下函数来确保数据库解锁,即使之前未正确提交和关闭:

from sqlite3 import dbapi2 as sqlite


def unlock_db(db_filename):
    """Replace db_filename with the name of the SQLite database."""
    connection = sqlite.connect(db_filename)
    connection.commit()
    connection.close()

2

删除-journal文件听起来像是一个坏建议。请参阅这个解释


2
也许你的应用在SQLite事务开始后就意外终止了。请查找目录中过时的-journal文件并将其删除。
值得一提的是,建议也浏览一下文档

2
这是非常糟糕的建议,很容易导致数据库损坏。详见http://www.sqlite.org/lockingv3.html#rollback。 - escouten

0

我也曾经在将数据库文件挂载到NFS文件系统时遇到过这个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接