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

一  作用

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张图片

结论: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的详解_第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的详解_第3张图片

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

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

你可能感兴趣的:(分布式,mysql数据库,数据库,oracle,sql)