1.排他鎖(x鎖)
解決多個程式同時修改乙個資料,造成的資料丟失問題。
----------read uncommitted(讀未提交)----------(存在髒讀問題)
2.共享鎖(s鎖)
解決髒讀問題(甲修改了資料,卻沒有將資料提交或回滾了資料,乙讀到了甲修改後的『錯誤的資料』而不是資料庫中現在真實存在的資料約定:
----------read committed(讀已提交)----------(存在不可重複讀問題)
3.到事務提交前後才釋放鎖
解決不可重複讀的問題(甲讀取了某個資料釋放了s鎖後,乙隊獲取該資料的x鎖對資料做了修改,釋放x鎖,甲再獲取s鎖讀資料,發現資料變了。)
---------- repeatable read(可重複讀)----------(存在幻讀問題)
4.序列化(在一方提交事務前,另一方無法操作)
解決幻讀的問題。甲查詢了某條資料如:
select * from user where id = 1
發現資料不存在,之後甲在表中插入了一條如
insert into user(id, name) values (1, '張三')
甲再去查id=1的資料,發現竟然又有了!
間隙鎖同樣也是有防止幻讀的作用(防止在查詢某個範圍的記錄時有人在這個範圍內插入新的資料,而使前後的查詢結果不一致)。
值得注意的是,事務隔離的rr級別只對已存在資料有保護作用,而無法防止新的資料插入,這是兩者隔離的差異
------------ serializable(序列化)--------------
高階別的事務隔離,必會造成資料庫的併發性變差,因此再非必須情況下,可將事務隔離級別調低。mysql的預設事務級別使rr,為了獲取更高的併發能力,mysql還提供了一種mvcc(多版本併發控制)方法,解決不可重複讀的問題,而且讓程式在讀資料時不必再加共享鎖,只需要找到正確的版本。rc+mvcc能獲得很好的併發效能。具體mvcc的實現可以參見:
MySQL鎖與事務隔離機制
事務行鎖和隔離級別的案例分析 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除了傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供需要使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重...
mysql 鎖 事務隔離級別
最近在看mysql相關的書籍.實驗了一些內容.分享一下,主要是關於事務隔離級別 read committed和repeatable read 和鎖相關的.很多網上文章上都能搜尋到 read committed可以防止髒資料.但是不能防止 不可重複讀.而repeatable read可以防止 不可重複...
事務隔離與鎖機制
innodb 儲存引擎既支援行級鎖,也支援表級鎖,預設情況下使用行級鎖。所謂表級鎖,它直接鎖住的是乙個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。所謂頁級鎖,它是鎖住的乙個...