MySQL 9.0 版本注意事項
當交易更新資料表中的列,或使用 SELECT FOR UPDATE
鎖定列時,InnoDB
會在該列上建立鎖定的清單或佇列。同樣地,InnoDB
會維護資料表層級鎖定的資料表鎖定清單。如果第二個交易想要更新列或鎖定先前交易以不相容模式鎖定的資料表,InnoDB
會將該列的鎖定要求新增至對應的佇列。為了讓交易取得鎖定,必須移除先前輸入該列或資料表之鎖定佇列的所有不相容鎖定要求 (這會在持有或要求這些鎖定的交易提交或回滾時發生)。
交易可能對不同的列或資料表有多個鎖定要求。在任何給定時間,交易可能會要求另一個交易持有的鎖定,在這種情況下,它會被另一個交易封鎖。要求鎖定的交易必須等待持有封鎖鎖定的交易提交或回滾。如果交易沒有等待鎖定,則它處於 RUNNING
狀態。如果交易正在等待鎖定,則它處於 LOCK WAIT
狀態。(INFORMATION_SCHEMA
INNODB_TRX
資料表會指出交易狀態值。)
Performance Schema data_locks
資料表會針對每個 LOCK WAIT
交易保留一或多列,指出任何阻止其進度的鎖定要求。此資料表也包含一列,描述給定列或資料表待處理鎖定佇列中的每個鎖定。Performance Schema data_lock_waits
資料表會顯示交易已持有的哪些鎖定,會封鎖其他交易要求的鎖定。