个人理解是通过for update 锁住一行数据的,select查询能加排它锁吗???
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
个人理解基本正确。FOR UPDATE
子句确实可以用来在事务中锁住被查询到的行,从而阻止其他事务对这些行进行并发修改或删除。这等同于在所选数据行上放置了一个排他锁(Exclusive Lock),直到当前事务结束为止。
详细说明:
锁定机制:当您在SELECT
语句末尾添加FOR UPDATE
时,数据库系统会为检索出的每一行记录加上排他锁。这意味着:
UPDATE
、DELETE
或再次执行带有FOR UPDATE
的SELECT
操作,直至当前事务提交或回滚。WAIT n
、NOWAIT
或SKIP LOCKED
选项,而锁定的行已经被其他事务占用,那么此SELECT FOR UPDATE
将会等待,直到那些锁被释放。选择性与限制:需要注意的是,FOR UPDATE
不能应用于聚合函数或无法明确标识单行的查询上下文中,比如当你使用分组(GROUP BY)或统计函数(SUM, AVG等)时,因为这些操作不直接对应到特定的行。
锁定选项:通过附加WAIT n
、NOWAIT
或SKIP LOCKED
,您可以控制SELECT FOR UPDATE
的行为:
WAIT n
可以让查询等待特定时间以获取锁。NOWAIT
会让查询立即返回错误,如果行已被锁定。SKIP LOCKED
则会使查询跳过已被锁定的行,继续处理未被锁定的行。综上所述,SELECT ... FOR UPDATE
确实能够实现对查询结果行加排他锁的目的,确保了在事务处理期间数据的一致性和隔离性。不过,其应用需谨慎,特别是在高并发场景下,不当使用可能会导致锁争用和性能问题。