温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标会锁表吗

发布时间:2026-08-31 18:19:44 来源:亿速云 阅读:87 作者:小樊 栏目:数据库

简要结论先给出:

Cursor(游标)本身“不一定锁表”,是否锁表取决于数据库类型、隔离级别、Cursor 的实现方式以及是否加锁读取。

下面按常见数据库分开说明。


一、MySQL(InnoDB)

1️⃣ 普通游标(非 FOR UPDATE

DECLARE cur CURSOR FOR SELECT * FROM t;
  • 不会锁表
  • 使用的是 MVCC 一致性读
  • 读取的是快照数据
  • 其他事务可以正常读写该表

结论:不锁表,也不锁行


2️⃣ FOR UPDATE 游标

DECLARE cur CURSOR FOR SELECT * FROM t FOR UPDATE;
  • 会加行锁
  • 被游标 fetch 到的行会被加锁
  • 其他事务不能修改这些行
  • 仍不是锁整张表

结论:行级锁,不锁表


3️⃣ 隔离级别影响

隔离级别 游标行为
READ COMMITTED 非锁定读
REPEATABLE READ(默认) 一致性快照
SERIALIZABLE 可能退化成范围锁

二、PostgreSQL

1️⃣ 普通游标

DECLARE cur CURSOR FOR SELECT * FROM t;
  • 不锁表
  • 使用 MVCC
  • 每个 fetch 都是一致性读

2️⃣ FOR UPDATE 游标

DECLARE cur CURSOR FOR SELECT * FROM t FOR UPDATE;
  • 会锁行
  • 每一行在被 fetch 时加锁
  • 直到事务结束才释放

结论:行锁,不锁表


三、Oracle

1️⃣ 普通游标

CURSOR c IS SELECT * FROM t;
  • 不锁表
  • 使用 undo 保持一致读

2️⃣ FOR UPDATE 游标

CURSOR c IS SELECT * FROM t FOR UPDATE;
  • 行级排他锁
  • 被 fetch 的行立即被锁
  • 其他事务不能修改

结论:仍然不锁表


四、SQL Server

1️⃣ 默认游标

  • 默认是 快照式游标
  • 不锁表

2️⃣ SCROLL LOCKS / UPDLOCK

DECLARE cur CURSOR SCROLL LOCKS FOR ...
  • 会加 页锁 / 行锁
  • 可能引起阻塞
  • 不是整表锁

五、会不会“锁全表”?

场景 是否锁表
普通游标
FOR UPDATE 游标 ❌(行锁)
大事务 + 锁升级 ⚠️(极端情况)
LOCK TABLE ✅(人为)

六、什么时候游标容易“像锁表一样”?

  • 游标 事务过长
  • 在大表上 FOR UPDATE
  • 游标 + 未提交事务
  • 锁升级(SQL Server)

七、一句话总结

Cursor 本身不会锁表,是否锁取决于是否使用 FOR UPDATE / 隔离级别 / 数据库实现,通常最多是行锁,而不是表锁。

如果你能告诉我:

  • 用的是 哪种数据库
  • 是否是 存储过程游标
  • 是否涉及 更新 / 删除

我可以直接给你一个最合适、最小锁的方案

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI