数据库悲观锁 select for update的详解

发布时间:2024年01月11日

一? 作用

1.1 结论

在mysql中,select ... for update 仅适用于InnoDB,且必须在事务块中才能生效。Innodb引擎默认是行锁。

??Select ?.... ?from ?where ?.... ??for update 如果在where的查询条件字段使用了【主键|索引】,则此命令上行锁。否则,则命令上表锁。它是悲观锁的一种实现方式。

1.2 操作案例

1.2.1?查询条件为主键

场景1:查询条件为主键

会话A: select * from tb_pab where id=1 for update;

会话B: update ?tb_pab ??set ?uname='bj' where id=1;==》出现阻塞

结论:select for update 查询条件为主键,则进行上行锁。

1.2.2?查询条件为唯一索引

场景2:查询条件为唯一索引

会话A: select * from tb_pab where code='001' for update;

会话B: update ?tb_pab ??set ?uname='bj123' where id=1;==》出现阻塞

会话C: ?update ?tb_pab ??set ?uname='bj123' where id=2; ?非阻塞

结论:select for update 查询条件索引,则进行上行锁。

1.2.3??查询条件为普通字段,不加索引和主键

场景3:查询条件为普通字段,不加索引和主键

会话A: select * from tb_pab where name='sh' for update;

会话B: update ?tb_pab ??set ?uname='sh2' where id=1;==》出现阻塞

会话C:update ?tb_pab ??set ?uname='sh2' where id=2;==》出现阻塞

结论:select for update 查询条件非【主键|索引】,则进行上锁。

SELECT...FOR UPDATE_select for update-CSDN博客

文章来源:https://blog.csdn.net/u011066470/article/details/135532570
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。