mysql鎖是mysql爲了保證數據的正確性(只允許一個進程操作數據)而做的一系列操作
1:mysql鎖分類?
按照鎖粒度分爲:行鎖,頁級鎖,表鎖
常用的存儲引擎中:innodb默認支持的是行鎖,5.6之後的innodb也支持表鎖。
Myisam採用的是表鎖
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般
按照鎖機制分爲:排他鎖,共享鎖
共享鎖就是多個事務對於同一數據可以共享一把鎖,都能訪問到數據,但是隻能讀不能修改
排他鎖就是不能與其他鎖並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取。
2:mysql鎖導致的阻塞/死鎖?
阻塞:
當數據庫發生改變時,會對修改的表進行加鎖(行鎖/頁鎖/表鎖),其他事物操作會等待鎖釋放纔會繼續執行
死鎖(產生的必要條件:互斥,佔有且等待,不可搶佔,循環等待):
多個線程互相持有對方所需要的資源,導致這些線程一直處於等待中
通俗易懂的理解:比如A和B兩個人,一個廁所坑位,一卷衛生紙,A進廁所蹲坑去了,即A佔有了坑,
但是A沒拿衛生紙,B拿了衛生紙後,B也想上廁所了,發現坑位有人了,那在門外等候,A佔有了坑位
,B佔有了紙,A想得到紙,但是發現被B佔了,都**沒紙,怎麼出來,B想上廁所,發現廁所被A佔
了,那**的怎麼辦,最後形成了僵持局面,A拿不到紙就佔着坑不出去,B進不去坑我就拿着紙,然
後兩個就這樣一直僵持着,形成了死鎖
死鎖預防措施?
除了互斥,破壞其他三個條件。爲了數據的正確,互斥是必須的。
3:樂觀鎖,悲觀鎖?
樂觀鎖:認爲每次操作數據都不會對數據庫表發生改變。很樂觀,只是在更新這條數據的時候判斷一下數據
是否有衝突。
實現原理:
在表中的數據進行操作時(更新),先給數據表加一個版本(version)字段,每操作一次
,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version字段,如果要對
那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version
的值相等,如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,將
version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值
不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。
悲觀鎖:認爲每次操作都會對數據庫發生改變,很悲觀。所以每次操作都會對數據庫進行加鎖,耗費資源
總結:兩者各有優缺點。樂觀鎖適合多讀的情況,如果業務修改異常頻繁的話,只能用悲觀鎖保證數據
的正確