当前位置:主页 > 查看内容

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

发布时间:2021-05-13 00:00| 位朋友查看

简介:场景一:?当前使用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查询,其他地方查询? ?--? ?其他地方也使用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查询? ?--? ?不影响,不会堵塞

;原文链接:https://blog.csdn.net/huang007guo/article/details/115484612
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:初识Mongdb之数据查询篇(三) 下一篇:没有了

推荐图文


随机推荐