mysql排它锁(FOR UPDATE) 场景介绍

场景一: 当前使用for UPDATE查询,其他地方查询   --   其他地方也使用for UPDATE会堵塞, 其他地方未使用for UPDATE不会堵塞

1. 当前A(不区分是否为事务里)使用for UPDATE查询

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

1.1 其他地方B(不在上一个连接里或事务里, 不区分是否为事务里)使用for UPDATE 查询(需要获取锁)

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

会发生堵塞等待前一个A锁释放(A事务提交,或者A结束运行(A为非事务场景))

1.2 其他地方C(不区分是否为事务里)不使用for UPDATE 查询(无需获取锁)

SELECT * FROM saas_employee_label_person where id = 1

不会堵塞,可以查询

场景二: 当前使用for UPDATE查询,其他地方UPDATE更新   --   会堵塞等待

2. 当前A(不区分是否为事务里)使用for UPDATE查询

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

2.1 其他地方B(不区分是否为事务里)使用UPDATE更新数据

UPDATE saas_employee_label_person set employee_id = 1111 where id = 1;

会发生堵塞等待前一个A锁释放(A事务提交,或者A结束运行(A为非事务场景))

场景三: 当前事务使用UPDATE更新, 其他地方使用for UPDATE查询   --   会堵塞等待

3. 当前事务A 使用UPDATE更新

BEGIN;
UPDATE saas_employee_label_person set employee_id = 11121 where id = 1;

3.1 其他地方B(不区分是否为事务里)使用 for UPDATE查询

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

会发生堵塞等待前一个事务A提交才可以获得锁

场景四: 当前非事务使用UPDATE更新, 其他地方使用for UPDATE查询   --   不会堵塞

4. 当前A(非事务下) 使用UPDATE更新

UPDATE saas_employee_label_person set employee_id = 11121 where id = 1;

4.1 其他地方B(不区分是否为事务里)使用 for UPDATE查询

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

不会堵塞,前一个update先执行完,所以不影响,这里一定是update先执行完在走for UPDATE查询的场景,否者就是场景二了

场景五: 当前普通查询,其他地方使用for UPDATE查询   --   不影响,不会堵塞

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值