python-3.x - 当没有其他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
文件位于本地安装的常规硬盘驱动器上。
除了做之外,我如何调查正在发生的事情:
- 我可以在 myfile.db 上检查 fuser -v
我确实假设任何其他写入过程仅在执行事务时锁定数据库。完成后,它会释放锁。
此外,在 WAL 模式下,事情是否应该以不同的方式工作?
解决方案
来自文档: sqlite3 模块在数据修改语言 (DML) 语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即除了 SELECT 之外的任何语句)之前隐式提交事务或上述)。
就我而言,我只有一个UPDATE
,这意味着之前 sqlite3 插入了一个 BEGIN,然后是signal.pause()
,这意味着我没有遇到非 DML stmt,并且事务在睡觉前仍然处于活动状态
另一个进程尝试运行一段UPDATE
时间,第一个进程仍然处于睡眠状态(并且事务处于活动状态)。
我之前加了 conn.commit()
一个signal.pause()
推荐阅读
- xml - finvoice/xml 文件电子发票的电子邮件 mime 类型是什么(xml 而不是 pdf)?
- sql - 根据列中的状态更改创建触发器并在表的另一列中插入值
- php - 无法打开阅读!文件不存在。代码点火器 PHPEXCEL
- python-3.x - 使用 Python 3“请求”包访问具有 IP V6 地址的 Web 服务器:适用于 W10,不适用于 Rasberry Pi OS
- aem - AEM 6.5 侧栏中没有显示组件
- python - Keras分类模型布局
- r - R:在“)”之后提取文本
- django - 'QuerySet' 对象没有属性 'user'
- swift - MetalPlugin 问题:MetalPluginName 属性或类型错误
- weighted - 如何修复 UseMethod("filter") 中的错误?它仍然得到平均线