MySQL 8 InnoDB 鎖定讀(Locking Reads)分為SELECT ... FOR SHARE
與SELECT ... FOR UPDATE
,兩者差異如下。
SELECT ... FOR SHARE
SELECT ... FOR SHARE
會鎖定讀取的資料,其他session的交易可做一般讀及shared mode鎖定讀但無法修改,直到原鎖定讀的交易提交後其他session的交易才能修改。若鎖定讀的交易未提交前有另一交易查詢該筆資料,則該查詢會等待直到鎖定讀交易結束後才會查詢。
SELECT ... FOR UPDATE
SELECT ... FOR UPDATE
會鎖定讀取的資料,其他session的交易可做一般讀,但會阻塞shared mode鎖定讀、修改、及某些隔離層級的讀取。
所以SELECT ... FOR SHARE
與SELECT ... 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 |
+--------------+----------------------+-----------------------+
沒有留言:
張貼留言