網頁

2020/12/6

MySQL 8 InnoDB SELECT FOR SHARE 與 SELECT FOR UPDATE 差異

MySQL 8 InnoDB 鎖定讀(Locking Reads)分為SELECT ... FOR SHARESELECT ... FOR UPDATE,兩者差異如下。


SELECT ... FOR SHARE

SELECT ... FOR SHARE會鎖定讀取的資料,其他session的交易可做一般讀及shared mode鎖定讀但無法修改,直到原鎖定讀的交易提交後其他session的交易才能修改。若鎖定讀的交易未提交前有另一交易查詢該筆資料,則該查詢會等待直到鎖定讀交易結束後才會查詢。


SELECT ... FOR UPDATE

SELECT ... FOR UPDATE會鎖定讀取的資料,其他session的交易可做一般讀,但會阻塞shared mode鎖定讀、修改、及某些隔離層級的讀取。


所以SELECT ... FOR SHARESELECT ... FOR UPDATE皆能被其他session交易一般讀且皆不能被修改,但SELECT ... FOR SHARE仍能再鎖定讀,而SELECT ... FOR UPDATE不能再鎖定讀。

+--------------+----------------------+-----------------------+
|              | SELECT ... FOR SHARE | SELECT ... FOR UPDATE |
+-------------------------------------------------------------+
|        QUERY |         YES          |          YES          |
+-------------------------------------------------------------+
| LOCKING READ |         YES          |          NO           |
+-------------------------------------------------------------+
|       UPDATE |         NO           |          NO           |
+--------------+----------------------+-----------------------+



沒有留言:

張貼留言