GridDB更新行失败:游标未锁定错误的原因与解决方法
GridDB更新记录报错“Cursor not locked”问题解决
错误含义
错误码140039/145039对应的“Cursor not locked”,本质是你尝试更新查询返回的行时,没有锁定目标记录。GridDB为了保证并发场景下的数据一致性,要求更新通过查询获取的行之前,必须先锁定该行,否则会拒绝执行更新操作。
解决方法
在你的SELECT查询语句末尾添加FOR UPDATE子句,让查询操作自动锁定匹配的行,这样后续就能通过游标正常更新了。修改后的完整代码如下:
Container<Integer, Row> container = store.getContainer(studentinfo); if ( container == null ){ throw new Exception("Container not found."); } container.setAutoCommit(false); // 添加FOR UPDATE子句锁定目标行 Query<Row> query = container.query("SELECT * WHERE id = 1069971 FOR UPDATE"); RowSet<Row> rs = query.fetch(true); while( rs.hasNext() ){ Row row = rs.next(); row.setInteger(3, 88); rs.update(row); } container.commit(); System.out.println("Updated Row");
补充说明
FOR UPDATE会锁定查询返回的行,直到事务提交或回滚,能有效避免并发更新导致的数据冲突。- 你当前设置的手动提交事务(
setAutoCommit(false))是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Ismail Vohra
相关产品推荐
相关产品推荐

