Mysql InnoDB事務隔離級別

2021-09-11 05:56:55 字數 1475 閱讀 5995

隔離級別

髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

未提交讀(read uncommitted)

可能可能

可能已提交讀(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能可序列化(serializable )

不可能不可能

不可能具體來說:

未提交讀:

在這個事物隔離級別下,只加寫鎖不加讀鎖,所以讀的時候能讀到其他事務加了寫鎖的資料,因為不會發生鎖衝突。

所以當前事務還未提交的sql,其他的查詢都能查到。比如:事務a中的有條sql為將id=1的資料從1修改為2,當事務還沒提交時,其他的查詢就能查到此時id=1的資料為2,但是事務a因為某些問題回滾了,此時這個查詢到的2就是髒資料了。所以未提交讀對於髒讀、不可重複讀、幻讀都不能避免。

已提交讀:

已提交讀的事物隔離級別中會對資料的寫入、修改、刪除加行鎖,讀依然不加鎖,但是是快照讀,讀取undo log中最新的記錄,事務不提交不會生成記錄,所以讀不到其他事物未提交的修改。

所以可以避免其他查詢事務還沒提交的修改,也就是避免了髒讀。

但還是不能避免不可重複讀,比如當前事務a先讀取了id=1的資料為1,讀取完之後有條sql將資料修改為了2,此時事務a再來查詢的時候就變成2了,與第一次查詢到的1不同,兩次查詢結果不同,也就是不能重複的讀取同一條資料。當然也避免不了幻讀。

可重複讀:

可重複讀的事物隔離級別依然對資料的寫入、修改、刪除加行鎖。但是在讀操作中,如果是加了lock in share mode或者for update,是當前讀,會加共享鎖/拍他鎖,保證了可重複讀,如果不加,是快照讀,依然讀取的是undo log中的資料,並且讀取小於當前事務id的最新一條已提交資料,此時資料版本已經確定了,後面的快照讀取始終讀取這個版本。保證可重複讀。

具體的原因可以看:**innodb可重複讀 、 select加鎖分析

所以可以避免不可重複讀,因為在第一次讀取的時候就對這條資料加了鎖,其他的事務是不能對這條資料進行修改或者刪除的,但是可以讀。

但還是不能避免幻讀,幻讀說的是讀取的資料條數不同,而不是值不同。比如事務a第一次count 學生分數=80的有10條,此時有乙個事物b對錶中插入了10條學生分數=80的記錄,那麼事務a再來查詢的時候,學生分數=80的就有20條了,與第一次不一致,這就是幻讀。

可序列化:

可序列化的事物隔離級別是讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥。對讀取資料加了表鎖,整張表加了鎖之後其他事物就無法對插入、刪除和修改了,所以能避免幻讀,但是併發太差,基本不會被使用。除非是在併發量小、對資料準確性要求高的情況下才會使用。

innodb預設的隔離級別是可重複讀rr,用得最多的隔離級別是讀已提交rc。

MySQL innoDB的事務隔離

關於事務的特性?acid 原子性,一致性 隔離性 永續性。innodb 中的事務的隔離級別?讀提交 乙個事物在已提交的時候才可以被其他事務看到 可重複讀 乙個事務在執行過程中看到的資料,總是跟另個乙個事物在啟動時看到的資料是一致的,只要事務未提交都對其他事務是不可見的。讀未提交 這個事務還未提交就可...

Mysql Innodb事務的隔離級別

隔離級別 髒讀 dirty read 不可重複讀 nonrepeatable read 幻讀 phantom read 解釋未提交讀 read uncommitted 可能可能 可能事務a執行期間能讀到事務b修改且沒有提交的資料。已提交讀 read committed 不可能可能 可能事務a執行期間...

理解MySQL InnoDB事務隔離級別

本文為翻譯的文章,作者ovais.tariq,原文 隔離性是acid性質中很重要的部分,它保證事務以一種可靠的方式進行處理。隔離性確保同時執行的事務不會相互干擾。隔離性保證資料的一致性。如果事務沒有被隔離,那麼某個事務可能會修改其它事務正在讀取的資料,因而產生了資料的不一致。既然我們理解了隔離性是什...