最近碰到很多鎖問題,所以解決了後,仔細再去閱讀了關於鎖的書籍,整理如下:
1,鎖的種類Innodb儲存引擎實作如下
種標準的行級鎖定:? 共享鎖定(S lock)
? 共用鎖定資料。? 排它鎖(X lock)
,允許事務刪除或更新一行資料。當一個事務獲取了行
r
的共享鎖,那麼另外一個事務也可以立即獲取行鎖r的共享鎖,那麼另外一個事務也可以立即獲取行鎖r r的數據,這種情況就是鎖定相容。但如果有事務想取得行r的排它鎖,則它必須等待事務釋放行r上的共享鎖—這種情況就是鎖不相容,二者鎖定—這種情況就是鎖不相容,二者相容性如下表所示:
排它鎖和共享鎖的相容性
| ||||||||||||||||||||||
|
X 排它鎖 |
S 共享鎖 |
||||||||||||||||||||
衝突 |
2,鎖的擴充 Innodbdb存在。為了支援在不同粒度上進行加鎖操作,InnoDB儲存引擎支援一種額外的鎖定方式,就是意向鎖定。意向鎖是表格層級的鎖,其設計目的主要是為了在一個事務中揭示下一行將被要求的鎖的類型。它也分為兩種: ? 意圖共享鎖定(IS Lock),事務想要取得一個表中某幾行的共享鎖定。 ? 意向排它鎖(IX Lock),事務想要獲得一個表中某幾行的排它鎖。 由於 InnoDB支持的是行級鎖定,所以意向鎖其實不阻塞除了全表scanscanscan。共享鎖、排它鎖、意向共享鎖、意向排它鎖相互之前都是有兼容/互斥關係的,可以用一個兼容性矩陣表示(y表示兼容,n 表示不兼容),如下所示:
解析:X和S的相互相容關係 IS的相互關係全部是相容,這也很好理解,因為它們都只是“有意”,還處於YY階段,沒有真幹,所以是可以兼容的;剩下的就是X和 ,X和IS, S和IX, S和, S的關係推導出這四組關係。 簡單的說:X和IX的=X和X的關係。為什麼呢?因為事務在取得IX鎖後,接下來就有權利取得X鎖。如果X和IX相容的話,就會出現兩個事務都獲取了X鎖的情況,這與我們已知的X鎖的情況,這與我們已知的X互斥是矛盾的,所以X與IX只能是互斥關係。其餘的三組關係同理,可用同樣的方式推導出來。
3,模擬鎖定場景3 在InnoDB Plugin之前,我們只能透過SHOW FULL PROCESSLIS和SHOW ENGINE INNODB STATUS和SHOW ENGINE INNODB STATUS和SHOW ENGINE新版的InnoDB Plugin中,在information_schema庫中新增了3張表, INNODB_LOCK_WAITS。透過這3個表,可以更簡單的監控當前的事務並且分析可能存在的鎖定問題。如果資料庫正常運行,這3個表都是空的,沒有任何記錄。 3.1,開啟事務t1、t2,模擬鎖定 ,模擬鎖定 窗口,並且開啟2個事務t1和t2。 在第一個視窗開啟事務t1 做一個鎖定操作,如下 mysql> 这个时候,事务t1已经锁定了表t1的所有a<5的数据行,然后去第二个窗口开启第二个事务t2,如下,会看到update语句一直在等待事务t1释放锁资源,过了几秒后,会有报错信息,如下t2事务窗口界面: mysql> 7,MySQL外键和锁 在innodb存储引擎中,对于一个外键列,如果没有显式的针对这个列添加索引Innodb存储引擎会自动的对其添加一个索引,这样可以避免表锁,这点比oracle做的较好一些,oracle需要自己手动添加外键锁。 以上就是MySQL 温故而知新--Innodb存储引擎中的锁的内容,更多相关内容请关注PHP中文网(www.php.cn)! |