最近碰到很多鎖問題,所以解決了后,仔細再去瀏覽了關于鎖的書籍,整理以下:
1,鎖的種類
Innodb存儲引擎實現了以下2種標準的行級鎖:
? 同享鎖(S lock),允許事務讀取1行數據。
? 排它鎖(X lock),允許事務刪除或更新1行數據。
當1個事務獲得了行r的同享鎖,那末另外1個事務也能夠立即獲得行r的同享鎖,由于讀取并未改變行r的數據,這類情況就是鎖兼容。但是如果有事務想取得行r的排它鎖,則它必須等待事務釋放行r上的同享鎖―這類情況就是鎖不兼容,2者兼容性以下表格所示:
排它鎖和同享鎖的兼容性 | ||
| X 排它鎖 | S 同享鎖 |
X 排它鎖 | 沖突 | 沖突 |
S 同享鎖 | 沖突 | 兼容 |
2,鎖的擴大
Innodb存儲引擎支持多粒度鎖定,這類鎖定允許在行級別上的鎖和表級別上的鎖同時存在。為了支持在不同粒度上進行加鎖操作,InnoDB存儲引擎支持1種額外的鎖方式,就是意向鎖。意向鎖是表級別的鎖,其設計目的主要是為了在1個事務中揭露下1即將被要求的鎖的類型。它也分為兩種:
? 意向同享鎖(IS Lock),事務想要取得1個表中某幾行的同享鎖。
? 意向排它鎖(IX Lock),事務想要取得1個表中某幾行的排它鎖。
由于InnoDB支持的是行級別鎖,所以意向鎖其實不大會阻塞除全表scan以下的任何要求。同享鎖、排它鎖、意向同享鎖、意向排它鎖相互之前都是有兼容/互斥關系的,可以用1個兼容性矩陣表示(y表示兼容,n表示不兼容),以下所示:
| X 排它鎖 | S 同享鎖 | IX 意向排它鎖 | IS 意向同享鎖 |
X 排它鎖 | 沖突 | 沖突 | 沖突 | 沖突 |
S 同享鎖 | 沖突 | 兼容 | 沖突 | 兼容 |
IX 意向排它鎖 | 沖突 | 沖突 | 兼容 | 兼容 |
IS 意向同享鎖 | 沖突 | 兼容 | 兼容 | 兼容 |
解析:X和S的相互兼容關系step1描寫過了,IX和IS的相互關系全部是兼容,這也很好理解,由于它們都只是“成心”,還處于YY階段,沒有真干,所以是可以兼容的;
剩下的就是X和IX,X和IS, S和IX, S和IS的關系了,我們可以由X和S的關系推導出這4組關系。
簡單的說:X和IX的=X和X的關系。為何呢?由于事務在獲得IX鎖后,接下來就有權利獲得X鎖。如果X和IX兼容的話,就會出現兩個事務都獲得了X鎖的情況,這與我們已知的X與X互斥是矛盾的,所以X與IX只能是互斥關系。其余的3組關系同理,可用一樣的方式推導出來。
3,摹擬鎖場景
在InnoDB Plugin之前,我們只能通過SHOW FULL PROCESSLIS和SHOW ENGINE INNODB STATUS來查看當前的http://www.vxbq.cn/db/要求,然后再判斷事務中鎖的情況。新版本的InnoDB Plugin中,在information_schema庫中添加了3張表,INNODB_LOCKS、INNODB_TRX、INNODB_LOCK_WAITS。通過這3個表,可以更簡單的監控當前的事務并且分析可能存在的鎖問題。如果http://www.vxbq.cn/db/正常運行,這3個表都是空的,沒有任何記錄。
3.1,開啟事務t1、t2,摹擬鎖
開啟2個session窗口,并且開啟2個事務t1和t2。
在第1個窗口開啟事務t1履行1個鎖定操作,以下t1事務窗口界面:
mysql> set autocommit =0;
Query OK, 0 rows affected (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
開始履行鎖定操作
mysql> select * from test.t1 where a<5 for update;
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈