MySQL鎖機制淺析
MySQL使用了3種鎖機制
行級鎖,開銷大,加鎖慢,會出現死鎖,發生鎖沖突的概率最高,並發度也最高
表級鎖,開銷小,加鎖快,不會出現死鎖,發生鎖沖突的概率最低,並發度最低
頁級鎖,開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般
MySQL的存儲引擎,這裏指常用的,InnoDB,默認是行級鎖,如果不指定主鍵的話,那麽就是表級鎖了,這點切記
MyISAM是表鎖
innoDB
先來了解下MySQL事務
事務是由一組sql語句組成的邏輯處理單元,有4個屬性ACID
原子性,Atomicity 事務是一個原子操作單元,數據的改變,要麽全部執行,要麽全部不執行,有一個不執行,就會全部不執行
一致性,Consistent 事務開始和完成時,數據都是一致的
隔離性,Ioslation 保證事務不受外界幹擾,根據隔離性的級別進行獨立的運行
持久性,Durable 事務commit之後,對數據的處理是一直有效的,永久性的
MySQL進行事務並發的時候,會帶來以下幾個問題
臟讀,事務A和事務B都操作同一行,A是search,B是update,B更新之後,A進行查詢,這個時候,B進行回滾,那麽剛剛A查詢到的數據就是臟數據,A的操作就是臟讀
不可重復讀,事務A和事務B都操作同一行,A是search,B是update,A先查詢,然後B進行更新,提交,A在查詢的時候,和第一次查詢的結果不一樣,這就是不可重復讀
幻讀,事務A和事務B都操作同一行,A是update,B是insert,A在更新的過程中,B進行了操作,結果A以為自己沒有進行剛剛的操作,就造成了幻讀
隔離級別
讀數據一致性及允許的並發副作用 隔離級別 | 讀數據一致性 | 臟讀 | 不可重復讀 | 幻讀 |
未提交讀(Read uncommitted) | 最低級別,只能保證不讀取物理上損壞的數據 | 是 | 是 | 是 |
已提交度(Read committed) | 語句級 | 否 | 是 | 是 |
可重復讀(Repeatable read) | 事務級 | 否 | 否 | 是 |
可序列化(Serializable) | 最高級別,事務級 | 否 | 否 | 否 |
共享鎖,也是讀鎖,加鎖期間,其他事務可以進行讀操作,不能進行寫操作,直到鎖解除
排他鎖,也是讀寫鎖,加鎖期間,其他事務不能進行讀寫操作,直到鎖解除,
MySQL鎖機制淺析