InnoDB事務隔離級別

2021-09-13 20:36:02 字數 2719 閱讀 1742

會話1

會話2begin

begin

update table set age = 10 where id = 1

select age from table where id = 1

commit

commit / rollback

會話2將age的值改變,且並未提交,此時會話1select查詢結果為10.

如果會話2 最終的結果是commit,那麼此查詢沒有問題

但是如果會話2 最終選擇rollback回滾,那麼會話1 的查詢結果是不正確的。

會話1會話2begin

begin

select age from table where id = 1

update table set age = 10 where id = 1

commit

select age from table where id = 1

commit

會話1 兩次查詢結果不一致,原因是會話2 進行了事務的提交。

需要注意的是兩次查詢是在同乙個事務中的。

會話1會話2begin

begin

select age from table where id > 2

insert into table(id,age) values (5,10)

commit

select age from table where id > 2

begin

commit

會話2 進行了資料的插入或刪除操作,並且提交。

mysql中(innodb引擎)的四種事務隔離級別

隔離級別

髒讀不可重複讀

幻讀read uncommitted (讀未提交)vv

vread committed(讀已提交)xv

vrepeatable read(可重複讀)(預設級別)xx

vserializable(序列化)xx

xinnodb引擎針保證資料一致性的原理:

1.mvcc

在每一行資料中加上兩個隱藏字段,記錄行的建立時間過期時間,但實際儲存的是版本號,而不是時間,每開啟乙個新的事物,版本號加一。

2.innodb實現mvcc的方式:consistent read

首先看兩個概念

快照讀:讀取的是快照版本,也就是歷史版本

當前讀:讀取的是最新版本

普通的select就是快照讀,而update、delete、insert、select … lock in share mode、select … for update是當前讀。

一致性非鎖定讀(consistent nonlocking read)是指innodb儲存引擎通過多版本控制(mvvc)讀取當前資料庫中行資料的方式。如果讀取的行正在執行delete或update操作,這時讀取操作不會因此去等待行上鎖的釋放。相反地,innodb會去讀取行的乙個快照。

一致性非鎖定讀是innodb預設的讀取方式,即讀取不會占用和等待行上的鎖

事務隔離級別read committed和repeatable read,innodb使用一致性非鎖定讀

然而對於快照資料的定義卻不同:

read committed事務隔離級別下,一致性非鎖定讀總是讀取被鎖定行的最新乙份快照資料。

而在repeatable read事務隔離級別下,則讀取事務開始時的行資料版本。

如果只是有mvcc,並不能保證增刪改查一致性:

假設事務a更新表中id=1的記錄,

而事務b也更新這條記錄,並且b先提交,

如果按照前面mvvc說的,事務a讀取id=1的快照版本,那麼它看不到b所提交的修改,

此時如果直接更新的話就會覆蓋b之前的修改,b的修改就丟失了,這是不允許的。

所以,在修改的時候一定不是快照讀,而是當前讀。

3.間隙鎖

防止其他事務在鎖定的區域內插入資料,防止了幻讀。

總結

本來只有 serializable 隔離級別才可以解決幻讀問題,

而實際上由於 innodb 快照讀 的特性使 repeatable read 也解決了幻讀問題。

當前讀 中的幻讀問題,innodb預設為它加入了間隙鎖,從而避免出現幻讀。

使用場景:

快照讀(snapshot read)

簡單的select操作(不包括 select … lock in share mode, select … for update)

當前讀(current read)

select … lock in share mode

select … for update

insert

update

delete

在repeatable read(可重複讀)(預設級別)下:

快照讀 是通過mvvc(多版本控制)實現;

當前讀 是通過加record lock(記錄鎖)和gap lock(間隙鎖)來實現的。

innodb事務隔離級別

事務隔離級別 sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用...

Mysql 事務隔離級別 InnoDB實現隔離機制

在read uncommitted級別中,事務所做的寫操作,即使沒有提交,對其他事務也是可見的,a事務可以讀取b事務未提交的資料,這就叫做未提交讀 髒讀。這個級別會導致很多問題,但從效能上來說,並不比其他級別好太多。大部分資料庫系統的預設隔離級別就是 read committed,它解決了髒讀的問題...

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...