事務隔離與鎖機制

2021-09-24 23:50:08 字數 1659 閱讀 3300

innodb 儲存引擎既支援行級鎖,也支援表級鎖,預設情況下使用行級鎖。

所謂表級鎖,它直接鎖住的是乙個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。

所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。

所謂頁級鎖,它是鎖住的乙個頁面,它的開銷介於表級鎖和行級鎖中間,也可能會出現死鎖,鎖定粒度也介於表級鎖和行級鎖中間,併發度也介於表級鎖和行級鎖中間。

行級鎖更適合大量按照索引條件併發更新少量不同的資料,同時還有併發查詢的應用

資料庫實現事務隔離的方式,基本可以分為兩種:

innodb有兩種型別的行級鎖,兩種內部使用的意向鎖;

共享鎖,排他鎖語句

4種鎖的共存邏輯關係

鎖模式共享鎖(s)

排他鎖(x)

意向共享鎖(is)

意向排他鎖(ix)

共享鎖(s)

相容衝突

相容衝突

排他鎖(x)

衝突衝突

衝突衝突

意向共享鎖(is)

相容衝突

相容相容

意向排他鎖(ix)

衝突衝突

相容相容

事務併發下由於隔離級別的不同,存在的4種問題

4種隔離級別

對應關係表

隔離級別

讀資料一致性

髒讀不可重複讀的問題

幻讀未提交讀

最低級別,只能保證不讀取物理上損壞的資料是是

是直接操作磁碟

已讀提交

語句級否是是

查詢磁碟,操作記憶體

可重複讀取

事務隔離級別否否

是查記憶體,寫記憶體

序列化最高端別,事務級否否

否事務的隔離級別設定的越高,併發的事務越少,越接近於序列

設定隔離級別 :set @@gloabl.tx_isolation = 『serializable』;每行資料都存在乙個版本,每次資料更新時都更新該版本

修改時copy出當前版本隨意修改,各個事務之間無干擾

儲存時比較版本號,如果成功(commit),則覆蓋原記錄;失敗則放棄copy(rollback)

在每一行資料中額外儲存兩個隱藏的列:當前行建立時的版本號和刪除時的版本號,在進行update,delete操作是對兩隱藏列進行操作,版本號自動+1。

idname

c_version

d_version

1ghost

1進行update之後,舊的記錄視為已刪除,將新記錄刪除版本號

idname

c_version

d_version

1ghost12

1ghostzzz

2刪除,將新的版本號作為刪除版本號

idname

c_version

d_version

1ghostzzz23

通過上例可以看出:

刪除版本號大於當前版本號或未指定,則當前記錄未被刪除

建立版本號 小於或者等於 當前事務版本號 ,就是說記錄建立是在當前事務中(等於的情況)或者在當前事務啟動之前的其他事物進行的insert

mvcc的版本號只會在事務提交之後才會產生,所以支援的事務包括讀已提交(read committed)和可重複讀(repeatable read)

MySQL鎖與事務隔離機制

事務行鎖和隔離級別的案例分析 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除了傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供需要使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重...

MySQL鎖與事務隔離

1.排他鎖 x鎖 解決多個程式同時修改乙個資料,造成的資料丟失問題。read uncommitted 讀未提交 存在髒讀問題 2.共享鎖 s鎖 解決髒讀問題 甲修改了資料,卻沒有將資料提交或回滾了資料,乙讀到了甲修改後的 錯誤的資料 而不是資料庫中現在真實存在的資料約定 read committed...

Mysql事務隔離級別和鎖機制

一.spring支援四種事務隔離級別 1.isolation read uncommitted 讀未提交 這是事務最低的隔離級別,它充許令外乙個事務可以看到這個事務未提交的資料。2.isolation read committed 讀已提交 保證乙個事務修改的資料提交後才能被另外乙個事務讀取。另外乙...