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

SQLite3执行查询时创建临时表出现意外表锁定错误

SQLite错误6:database table is locked 原因分析

你的问题核心是未关闭的查询语句持有数据库锁,导致后续DDL操作无法执行:

  1. 锁的来源
    你通过sqlite3_prepare_v2和sqlite3_step执行了SELECT * FROM tab1的查询,获取到第一行数据后,并没有关闭这个sqlite3_stmt对象。在SQLite的默认隔离级别下,这个未关闭的查询语句会持续持有对tab1的读锁。

  2. 冲突触发
    当你执行CREATE TEMP TABLE和DROP TABLE这类写操作时,SQLite需要获取对应的写锁,但此时读锁还未释放,锁冲突就会触发SQLITE_LOCKED(错误6)。

修复方案

在执行后续DDL操作前,必须调用sqlite3_finalize()关闭查询语句,释放持有的锁。修改后的关键代码如下:

s = sqlite3_step(stmt1);
if (s != SQLITE_ROW) check_error(__LINE__,s);

// 新增:关闭查询语句,释放锁
s = sqlite3_finalize(stmt1);
check_error(__LINE__, s);
stmt1 = NULL;

s = sqlite3_exec(conn, "create temp table tt1 ( pk integer, name varchar(50) )", NULL, NULL, &msg);
check_error(__LINE__,s);

修改后重新编译运行,锁冲突问题就会解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:50:13