這里要區分鎖中容易令人混淆的概念lock與latch。在數據庫中,lock與latch都可以成為鎖,但兩者有截然不同的含義
latch 一般稱為閂鎖(輕量級的鎖) 因為其要求鎖定的時間非常短,若遲勛時間長,則應用性能非常差,在InnoDB存儲引擎中,latch有可以分為mutex(互斥鎖)和rwlock(讀寫鎖)其目的用來保證並發線程操作臨界資源的正確性,並且沒有死鎖檢測的機制
lock的對象是事務,用來鎖定的是數據庫中的UI想,如表、頁、行。並且一般lock對象僅在事務commit或rollback后進行釋放(不同事務隔離級別釋放的時間可能不同),此外lock正如大多數數據庫中一樣,是有死鎖機制的。表顯示了lock與latch的不同
在InnoDB存儲引擎中的latch,可以通過命令SHOW ENGINE INNODB MUTEX 來進行查看
mysql> SHOW ENGINE INNODB MUTEX; +--------+-------------------+-------------+ | Type | Name | Status | +--------+-------------------+-------------+ | InnoDB | dict0dict.cc:1057 | os_waits=2 | | InnoDB | log0log.cc:844 | os_waits=1 | | InnoDB | fil0fil.cc:1690 | os_waits=1 | | InnoDB | dict0dict.cc:1066 | os_waits=3 | | InnoDB | log0log.cc:907 | os_waits=11 | +--------+-------------------+-------------+ 5 rows in set (4.14 sec)
在DEBUG版本下,通過SHOW ENGINE INNODB MUTEX 可以看到latch的更多信息
通過上述例子可以看到,type顯示的總是InnoDB,列Name顯示的是latch的信息及所在的源碼位置(行數)。列Status比較復雜,在DEBUG模式下,除了顯示os_waits,也會顯示count、spin_waits、spin_rounds、 os_yields、os_wait_times等信息。
相對於latch來看,lock信息就顯得直觀了。可以通過SHOW ENGINE INNODB STATUS 及information_schema架構下的INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS來觀察鎖的信息 。