Mysql鎖

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的值
	不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。

	悲觀鎖:認爲每次操作都會對數據庫發生改變,很悲觀。所以每次操作都會對數據庫進行加鎖,耗費資源


	總結:兩者各有優缺點。樂觀鎖適合多讀的情況,如果業務修改異常頻繁的話,只能用悲觀鎖保證數據

	的正確
	
	
	

	

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章