mysql官 事物 MySQL事務以及隔離級別

2021-10-18 22:17:31 字數 1336 閱讀 9810

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

我這裡解釋一下 「讀寫提交內容」 和 「可重讀」的區別。

假設有兩個事務t1, t2

讀寫提交內容:

t1 insert了一條資料,t2此時看不到,等t1commit了以後,t2才看到了。這就造成了t2前後兩次select的內容不一致,也就造成了不可重讀的原因。

可重讀:

t1 insert了一條資料,t2此時看不到,等t1 commit了以後,t2還是看不到。等t2事務進行提交了以後,在進行select,發覺,臥槽,資料怎麼多了一條出來,感覺出現了幻覺,即「幻讀」;

mvcc機制:

多版本併發控制(multiversion concurrency control)。mysql預設隔離級別為repeatable read(可重讀)。那麼mysql如何解決幻讀的。

就是利用mvcc機制。

什麼是多版本併發控制呢 ?其實就是在每一行記錄的後面增加兩個隱藏列,記錄建立版本號和刪除版本號,

而每乙個事務在啟動的時候,都有乙個唯一的遞增的版本號。

只有read-committed和 repeatable-read 兩種事務隔離級別才能使用mvcc

read-uncommited由於是讀到未提交的,所以不存在版本的問題

而serializable 則會對所有讀取的行加鎖。

mysql事物隔離 深度剖析 MySQL 事務隔離

概述 今天主要分享下mysql事務隔離級別的實現原理,因為只有innodb支援事務,所以這裡的事務隔離級別是指innodb下的事務隔離級別。隔離級別 讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀,幻讀,不可重複讀問題 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒...

mysql的事物特性 MySQL事務特性及隔離級別

事務的4個特性 在mysql中,innodb和bdb型別表可以支援事務。通過innodb和bdb型別表,mysql事務能夠完全滿足事務安全的acid測試,但是並不是所有表型別都支援事務,如myisam型別表就不能支援事務,只能通過偽事務對錶實現事務處理。acid指出每個事務型rdbms必須遵守的4個...

mysql事物提交語句 MySQL事務的提交

事務的提交方式為手動提交 有兩個賬戶,a賬戶有900元,b賬戶有1100元 開啟乙個事務,使用update語句,實現由b賬戶,向a賬戶轉100元的轉賬功能 可以看出,在事務中實現了轉賬功能 此時,退出資料庫,然後重新登入,查詢資料庫中各賬戶的餘額 可以看出,事務中的轉賬功能沒有成功 因此,在事務中轉...