场景一: 当前使用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查询的场景,否者就是场景二了