You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite新增sq_idA、sq_idB字段后报database is locked错误如何解决

SQLite 插入新记录触发database is locked错误解决方案

SQLite的database is locked错误本质是同一时间存在多个未释放的数据库连接对文件进行读写操作,你在新增sq_idA、sq_idB字段后触发该错误,大概率是新增的ID提取步骤引入了未正确释放的额外连接,可按以下步骤排查修复:

  • 优先检查ID提取逻辑的连接释放情况
    新增的id_sqA、id_sqB提取步骤如果是单独开启数据库连接查询,查询完成后没有立刻关闭连接,就会导致后续插入操作发起新连接时抢占锁失败。所有数据库操作完成后必须按顺序执行cur.close()(关闭游标)、conn.commit()(写入操作必须提交)、conn.close()(关闭连接),不要保持长连接驻留。

  • 合并ID查询与插入操作为单连接事务
    不要把ID提取、数据插入拆成多个独立的连接会话,建议将整组操作放到同一个连接中执行,避免多连接抢占锁:

# 参考实现逻辑
import sqlite3

# 全程仅使用一个连接完成所有操作
conn = sqlite3.connect("你的数据库文件名.db")
cur = conn.cursor()

# 提取id_sqA
cur.execute("SELECT 对应ID字段名 FROM 球队表 WHERE 队名字段=?", (sqA下拉选择值,))
id_sqA = cur.fetchone()[0]

# 提取id_sqB
cur.execute("SELECT 对应ID字段名 FROM 球队表 WHERE 队名字段=?", (sqB下拉选择值,))
id_sqB = cur.fetchone()[0]

# 执行插入操作
cur.execute("INSERT INTO 目标表(id_campionato,id_giornata,id_sqA,id_sqB,其他字段) VALUES (?,?,?,?,?)", 
            (id_campionato, id_giornata, id_sqA, id_sqB, 其他字段值))
conn.commit()

# 统一关闭资源
cur.close()
conn.close()
  • 增加连接超时参数适配偶发锁场景
    如果存在少量并发操作场景,可在创建连接时增加超时参数,让写入操作主动等待锁释放后再执行,单位为秒:
    conn = sqlite3.connect("你的数据库文件名.db", timeout=10)

  • 排查其他进程占用问题
    确认没有其他可视化数据库工具、后台进程以写入模式打开该数据库文件,这类外部占用也会触发锁报错,关闭所有占用进程即可恢复。

内容的提问来源于stack exchange,提问作者Erling Olsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:36:03