首页 > 解决方案 > 当没有其他python进程同时写入sqlite db数据库时,为什么会锁定它?

问题描述

在这里Python sqlite3 doc中,我看到默认超时为 5 秒。我在没有指定超时的情况下进行连接。蟒蛇 3.7。

我有 2 个写入同一个数据库的 python 进程。此 file.db 处于 WAL 模式。我在那里看到 2 个文件 -shm 和 -wal。

我得到了这个例外sqlite3.Error: 'database is locked'

在此异常发生时,另一个进程已完成其事务(退出with上下文管理器)并已进入睡眠状态signal.pause 文件位于本地安装的常规硬盘驱动器上。

除了做之外,我如何调查正在发生的事情:

  1. 我可以在 myfile.db 上检查 fuser -v

我确实假设任何其他写入过程仅在执行事务时锁定数据库。完成后,它会释放锁。

此外,在 WAL 模式下,事情是否应该以不同的方式工作?

标签: python-3.xsqlite

解决方案


来自文档: sqlite3 模块在数据修改语言 (DML) 语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即除了 SELECT 之外的任何语句)之前隐式提交事务或上述)。

就我而言,我只有一个UPDATE,这意味着之前 sqlite3 插入了一个 BEGIN,然后是signal.pause(),这意味着我没有遇到非 DML stmt,并且事务在睡觉前仍然处于活动状态

另一个进程尝试运行一段UPDATE时间,第一个进程仍然处于睡眠状态(并且事务处于活动状态)。

我之前加了 conn.commit()一个signal.pause()


推荐阅读