在济南历下区台式电脑的SQLite应用里,出现边扫描RTree边更新同一索引后提示表被锁,核心原因是Guttman RTree的写入可能大幅重构树,并改变节点扫描顺序。若原查询尚未跑完,游标还记得自己在RTree扫描中的位置,此时再对同一RTree执行更新,就可能收到SQLITE_LOCKED,并显示database table is locked一类的表被锁提示。偶尔成功,可能是查询已经先执行完,不能据此推广成每次都能同时改。

适用:本题对应SQLite3 RTree扩展在扫描期间写入的限制,对象是Windows台式电脑上使用SQLite RTree的应用。先核实际库版本、RTree功能与编译配置是否启用,再看已有去敏schema、SQL和日志;只核原游标、原语句和更新时序,不改生产库、不重发写入,也不通过杀进程或改影子表来验证。普通表与其他虚拟表应按各自事务、锁及模块规则判断,不能从本题得出它们一概允许并发写入,不能把RTree的限制套成所有表相同。
观察:先看原查询是否仍在逐行返回结果,例如查询条件为maxY大于等于35.0且minY小于等于35.0,从结果中取id后,再执行把maxY加0.5并限定同一id的更新。若日志显示查询游标尚未结束,更新同一RTree后出现SQLITE_LOCKED,则符合本题机制;若更新发生在查询完成之后,或错误来自其他锁冲突,则不能据此判断。偶发成功也要回到时序:查询是否先执行完、更新是否在另一连接或另一语句阶段发生。结果条件不同,结论应分开。
风险:在同一RTree扫描未结束时写入,可能打乱扫描顺序并触发锁定错误,使本次更新被拒绝;原查询及外层事务是否仍继续,要按各自返回和状态另核;用杀进程、改影子表或反复重发写入去试验,可能干扰现场并掩盖真实时序。不要把偶发成功当成稳定行为,也不要把RTree扩展的限制误判为普通表也如此。
下一步:收集去敏材料,包括SQLite版本与编译配置、RTree建表或索引语句、去敏查询与更新SQL、游标读取和更新先后顺序日志、错误码与提示文本。若确需基于同一RTree的复杂查询结果更新,可由原软件维护者在备份和授权范围内设计先完成查询、暂存结果再更新的顺序;本题只交接此设计方向,不在原库执行创建临时表或更新。需要咨询时可拨400-877-9605,电脑快修网是信息展示与第三方维修对接平台,该号码只作咨询,实际范围和安排需确认。