InnoDB 是一個支持事務的Engine,要保證事務ACID,必然會用到Lock。就像在Java編程一下,要保證數據的線程安全性,必然會用到Lock。了解Lock,Transaction可以幫助sql優化、deadlock分析等。
InnoDB中,有多種類別的鎖,下面將一一說明。
共享鎖(S)與排他鎖(X),這兩個鎖是row-level的鎖,也就是說,可以理解為,每一行記錄都有一把S,一把X鎖。共享鎖是讀鎖(Read Lock),事務執行時,如果要讀取一行數據,就要先持有該行數據的讀鎖(S)。排他鎖是寫鎖(Write Lock),事務執行時,如果要寫數據(即更新數據, 例如update, delete),則要先持有相應的行的寫鎖(X)。
此外,Read Lock可以同時被多個事務(實際上是執行這多個事務的線程)持有,Write Lock則不能。這一點,從設計上來講,和java中的ReadLock WriteLock是類似的。
也就是說ReadLock可以同時被多個線程持有,WriteLock只能被一個線程持有。
當一個線程A持有著ReadLock(S)時,線程B也可以持有ReadLock(S),但線程B不能去持有WriteLock(X)。同時線程A如果持有著ReadLock時,如果還想再去持有WriteLock,那麼必須等待其他的線程釋放ReadLock,並且沒有持有WriteLock。
當一個線程A持有著WriteLock時,其他的線程不能去持有WriteLock或者ReadLock,但他自己(線程A)還是可以去讀取的,而不需要去持有ReadLock。
意向鎖,想要做某事時的鎖,這是個表鎖。分為兩種:意向讀鎖(IS)、意向寫鎖(IX)。
如果你想要讀取某些行的記錄,必須得先持有表的IS鎖。想要修改、刪除某些行時,必須得先持有表的IX鎖。
X
IX
S
IS