个人理解是通过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确实能够实现对查询结果行加排他锁的目的,确保了在事务处理期间数据的一致性和隔离性。不过,其应用需谨慎,特别是在高并发场景下,不当使用可能会导致锁争用和性能问题。