← 返回资讯

改一个渠道却让其他写入都报database is locked,怎样缩短SQLite写事务

2026-10-24

SQLite在同一时刻仍只有一个写事务。管理员修改不同渠道也可能互相等待;如果写锁期间夹了外部检测或人工等待,应先缩小事务范围,再讨论适当的超时与重试。

确认是锁等待而非文件权限

锁竞争不一定发生在同一行。本例连接A更新第一行,连接B更新第二行,B仍因另一个写事务未结束而失败。这样可以排除“两个管理员都改了同一渠道”这一表层解释。调高timeout只改变愿意等多久,不能把数据库变成同时支持多个写者。

用屏障精确重现写锁持有

附件使用BEGIN IMMEDIATE取得写入资格,并以程序步骤之间的屏障代表耗时工作,不访问任何网络。B的短超时会得到locked错误;A提交后,同一份B更新成功,最终两行都是1。输出把失败和后续成功放在一起,证明阻挡来自事务生命周期,而不是第二行不允许修改。

把代码按BEGIN、UPDATE、等待、COMMIT四段标出来,很容易发现等待是否包在锁内。样例在捕获B的异常后显式rollback,然后才尝试恢复写入;少了这一步,应用可能把前一次失败状态带入后续逻辑。处理锁异常还应设置上限,不能使用没有截止条件的循环重试。

把busy_timeout与重试局限讲清

渠道连通性检查通常可以先在事务外进行,然后用短事务检查当前版本并写入结果。若外部结果依赖已读配置,应在保存时重新确认版本,避免为了缩锁又引入旧数据覆盖。异常处理也必须rollback,不能把失败连接带着未结束事务放回池中。

适用范围:等待用本地事件屏障模拟,不访问网络;不声称增加timeout或WAL可实现多写者并发。

配套样本与复核入口

  • run.py:独立运行程序,包含合成输入、操作和正反例断言。
  • case.json:输入说明、预期任务与适用范围,便于保存和交接。
  • observed.json:本次实际执行输出;临时路径、进程号和计时可能随运行变化。

执行后应得到other_row_write_blocked为真,after_commit包含两条值为1的记录。这里没有调用真实渠道,也不会长时间等待网络;同一程序严格安排两个连接的先后顺序。想进一步检查应用代码时,可照这个顺序标出取得写锁、调用外部服务、提交或回滚四个时刻,寻找哪些步骤本来不必处在写事务里。

Python3.8以上及标准库;使用Python自带SQLite。程序不读取现有网关数据库,全部样本写入内存或新建临时目录,执行完自动清理;没有任何模型API调用。

python -B run.py

阅读输出时,先按case.json中的任务逐项核对网关SQLite写事务锁等待,再与observed.json比较。非零退出表示依赖或断言需要处理,应保留实际错误。

一手依据1(SQLite只允许一个同时写事务;BEGIN/COMMIT/ROLLBACK控制合成表事务范围。);一手依据2(占位符绑定参数;rowcount、连接超时及progress_handler等接口按相应小节使用。)。

继续阅读:两名管理员先后保存渠道配置,怎样阻止旧页面覆盖新修改;后台统计查太久拖住网关管理进程,怎样给SQLite查询设置可取消预算;New API 部署实操:从 docker run 到生产可用。

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。模型接入、token 计费上有问题,也可以直接问。

去留微信

不想自己搭网关、自己维护渠道?

力达云是托管的 OpenAI / Anthropic 双格式端点,一期提供 DeepSeek,注册送 ¥5 额度。

去试用

这个页面有问题?

提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。