場景一: 當前使用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://www.uj5u.com/shujuku/273793.html
標籤:其他
上一篇:MySQL的簡單操作
