• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

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

互联网 diligentman 2周前 (04-08) 3次浏览

场景一: 当前使用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查询   —   不影响,不会堵塞


程序员灯塔
转载请注明原文链接:mysql排它锁(FOR UPDATE) 场景介绍
喜欢 (0)