简要结论先给出:
Cursor(游标)本身“不一定锁表”,是否锁表取决于数据库类型、隔离级别、Cursor 的实现方式以及是否加锁读取。
下面按常见数据库分开说明。
FOR UPDATE)DECLARE cur CURSOR FOR SELECT * FROM t;
✅ 结论:不锁表,也不锁行
FOR UPDATE 游标DECLARE cur CURSOR FOR SELECT * FROM t FOR UPDATE;
✅ 结论:行级锁,不锁表
| 隔离级别 | 游标行为 |
|---|---|
| READ COMMITTED | 非锁定读 |
| REPEATABLE READ(默认) | 一致性快照 |
| SERIALIZABLE | 可能退化成范围锁 |
DECLARE cur CURSOR FOR SELECT * FROM t;
FOR UPDATE 游标DECLARE cur CURSOR FOR SELECT * FROM t FOR UPDATE;
✅ 结论:行锁,不锁表
CURSOR c IS SELECT * FROM t;
FOR UPDATE 游标CURSOR c IS SELECT * FROM t FOR UPDATE;
✅ 结论:仍然不锁表
SCROLL LOCKS / UPDLOCKDECLARE cur CURSOR SCROLL LOCKS FOR ...
| 场景 | 是否锁表 |
|---|---|
| 普通游标 | ❌ |
| FOR UPDATE 游标 | ❌(行锁) |
| 大事务 + 锁升级 | ⚠️(极端情况) |
| LOCK TABLE | ✅(人为) |
FOR UPDATECursor 本身不会锁表,是否锁取决于是否使用
FOR UPDATE/ 隔离级别 / 数据库实现,通常最多是行锁,而不是表锁。
如果你能告诉我:
我可以直接给你一个最合适、最小锁的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。