事務隔離以及鎖

2021-09-10 09:21:32 字數 2396 閱讀 7583

undo log

binlog

併發事務的問題

事務隔離級別鎖死鎖

多版本併發控制,mvcc就是通過「讀取舊版本資料」來降低併發事務的鎖衝突,提高任務的併發度。

mvcc底層通過了redo和undo日誌來保證innodb事務的acid特性。

其中:redolog的寫入策略

binlog的寫入機制

快照讀:讀取回滾段中的資料,也就是歷史資料的快照,這些資料是不會被修改的。

讀到了未提交事務操作的記錄,例子如下:

-- 事務1,注意該事務沒有提交

insert

into

table

values

('a'

)-- 事務2,如果這是讀取到了事務1中的記錄,就是髒讀。

select

*from

table

乙個事務內相同的查詢,得到了不同的結果,例子如下

--事務1先執行select,得到結果value = "old"

select

*from

table

where id =

1--事務2執行之後直接提交

update

table

setvalue

="new"

where id =1;

commit

;--事務1再次執行select,得到結果value = "new"

select

*from

table

where id =

1

乙個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為「幻讀」。例子如下:

--事務1先執行,查詢到了0條資料

select

*from

table

where id>3;

--事務2執行並且提交

insert

into

table

values(4

,"test");

commit

;--事務1再執行insert,發生了錯誤

insert

into t values(4

,"real"

);

在這種隔離級別下,select語句是不加鎖的,在這種隔離級別下以上三種問題都會出現。

但是它是併發最高的。

所有的select語句都會被隱式的轉化為select ... in share mode,這意味著:

如果有未提交的事務正在修改某些行,所有讀取這些行的select都會被阻塞住。
這種隔離級別下,所有的問題都不會出現,但是併發性最差。

在rr級別下的加鎖規則

自增鎖是專門針對事務插入auto_increment型別的列,如果乙個事務正在往表中插入記錄,所有其他事務的插入必須等待,以便第乙個事務插入的行是連續的主鍵值。

意向鎖:未來的某個時刻,事務可能要加共享/排它鎖了,先提前宣告乙個意向,它是表級別的鎖,分為以下兩種:

-- 要設計is鎖

select..

.lock

inshare

mode

-- 要設計ix鎖

select..

.for

update

意向鎖之間並不相互互斥,而是可以並行。

插入意向鎖,是間隙鎖的一種(所以,也是實施在索引上的),它是專門針對insert操作的。

多個事務,在同乙個索引同乙個範圍區間插入記錄時,如果插入的位置不衝突,不會阻塞彼此

封鎖某一條的索引記錄

--它會在id為1的索引記錄上加鎖,以阻止其他事務插入,更新,刪除id=1這一行

select

*from

table

where id =

1for

update

封鎖索引記錄中的間隔,或者第一條索引記錄之前的範圍,又或者最後一條索引記錄之後的範圍。

進行等待,直到超時,通過引數innodb_lock_wait_timeout控制超時時間

發起死鎖檢測,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續進行。通過引數innodb_deadlock_detect進行控制

理解MySql事務隔離機制 鎖以及各種鎖協議

一直以來對資料庫的事務隔離機制的理解總是停留在表面,其內容也是看一遍忘一邊。這兩天決定從原理上理解它,整理成自己的知識。查閱資料的過程中發現好多零碎的概念如果串起來足夠寫一本書,所以在這裡給自己梳理乙個脈絡,具體的內容參考引文或在網上搜一下。由於平時接觸最多的是mysql,所以文章中某些部分是mys...

事務隔離與鎖機制

innodb 儲存引擎既支援行級鎖,也支援表級鎖,預設情況下使用行級鎖。所謂表級鎖,它直接鎖住的是乙個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。所謂頁級鎖,它是鎖住的乙個...

mysql 鎖 事務隔離級別

最近在看mysql相關的書籍.實驗了一些內容.分享一下,主要是關於事務隔離級別 read committed和repeatable read 和鎖相關的.很多網上文章上都能搜尋到 read committed可以防止髒資料.但是不能防止 不可重複讀.而repeatable read可以防止 不可重複...