MySQL 溫故而知新--Innodb儲存引擎中的鎖

黄舟
發布: 2017-02-16 11:57:56
原創
1363 人瀏覽過

最近碰到很多鎖問題,所以解決了後,仔細再去閱讀了關於鎖的書籍,整理如下:

1
,鎖的種類Innodb儲存引擎實作如下

2

種標準的行級鎖定:?  共享鎖定(S lock)

?  共用鎖定資料。

?  排它鎖(X lock)

,允許事務刪除或更新一行資料。

 

當一個事務獲取了行

r

的共享鎖,那麼另外一個事務也可以立即獲取行鎖

r的共享鎖,那麼另外一個事務也可以立即獲取行鎖r r的數據,這種情況就是鎖定相容。但如果有事務想取得行r的排它鎖,則它必須等待事務釋放行r上的共享鎖這種情況就是鎖不相容,二者鎖定這種情況就是鎖不相容,二者相容性如下表所示:

衝突S 
排它鎖和共享鎖的相容性

 

 

排它鎖

共享鎖

衝突

 

2,鎖的擴充

Innodbdb存在。為了支援在不同粒度上進行加鎖操作,InnoDB儲存引擎支援一種額外的鎖定方式,就是意向鎖定。意向鎖是表格層級的鎖,其設計目的主要是為了在一個事務中揭示下一行將被要求的鎖的類型。它也分為兩種:

?  意圖共享鎖定(

IS Lock),事務想要取得一個表中某幾行的共享鎖定。

?  意向排它鎖(

IX Lock),事務想要獲得一個表中某幾行的排它鎖。

 

由於

InnoDB支持的是行級鎖定,所以意向鎖其實不阻塞除了全表scanscanscan。共享鎖、排它鎖、意向共享鎖、意向排它鎖相互之前都是有兼容/互斥關係的,可以用一個兼容性矩陣表示(y表示兼容,n 表示不兼容),如下所示:

衝突相容

 

排它鎖

共享鎖

IS 意向共享鎖定

排它鎖

衝突

共享鎖

衝突

相容

衝突

兼容

衝突

衝突

相容

相容

IS

相容

相容

         解析:XS的相互相容關係 IS的相互關係全部是相容,這也很好理解,因為它們都只是“有意”,還處於YY階段,沒有真幹,所以是可以兼容的;剩下的就是X

XIS, SIX S S的關係推導出這四組關係。

簡單的說:XIX=XX的關係。為什麼呢?因為事務在取得IX鎖後,接下來就有權利取得X鎖。如果XIX相容的話,就會出現兩個事務都獲取了X鎖的情況,這與我們已知的X鎖的情況,這與我們已知的X互斥是矛盾的,所以XIX只能是互斥關係。其餘的三組關係同理,可用同樣的方式推導出來。

 

 

3,模擬鎖定場景3

InnoDB Plugin之前,我們只能透過SHOW FULL PROCESSLISSHOW ENGINE INNODB STATUSSHOW ENGINE INNODB STATUSSHOW ENGINE新版的InnoDB Plugin中,在information_schema庫中新增了3張表, INNODB_LOCK_WAITS。透過這3個表,可以更簡單的監控當前的事務並且分析可能存在的鎖定問題。如果資料庫正常運行,這3個表都是空的,沒有任何記錄。

3.1,開啟事務t1t2,模擬鎖定

t2

,模擬鎖定 窗口,並且開啟2個事務t1t2在第一個視窗開啟事務t1

做一個鎖定操作,如下  

mysql>

这个时候,事务t1已经锁定了表t1的所有a<5的数据行,然后去第二个窗口开启第二个事务t2,如下,会看到update语句一直在等待事务t1释放锁资源,过了几秒后,会有报错信息,如下t2事务窗口界面:

f112f93aa44923686eb2447a59d8e92d


mysql>

 

7MySQL外键和锁

innodb存储引擎中,对于一个外键列,如果没有显式的针对这个列添加索引Innodb存储引擎会自动的对其添加一个索引,这样可以避免表锁,这点比oracle做的较好一些,oracle需要自己手动添加外键锁。

 以上就是MySQL 温故而知新--Innodb存储引擎中的锁的内容,更多相关内容请关注PHP中文网(www.php.cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板