MySQL中事務的隔離級別

2021-10-09 01:16:29 字數 1827 閱讀 9377

隔離性其實比想象要複雜。在sql中定義了四種隔離的級別,每一種隔離級別都規定了乙個事務中的修改,哪些是在事務內和事務間是可見的,哪些是不可見的。較低階別的隔離通常來說能承受更高的併發,系統的開銷也會更小。

select @@tx_isolation;
基本語法

set session transaction isolation level 事務隔離級別
在read uncommitted級別,事務的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。這個級別的隔離會導致很多問題,雖然在效能方面是最優的,但是缺乏其他級別的很多好處,所以這種隔離的級別很少在實際中應用。

read uncommitted實踐 開啟兩個mysql session,並將mysql的預設隔離級別設定為read uncommitted

大多數資料庫系統預設的隔離級別都是read committed(但mysql不是),"讀已提交"簡單的定義:乙個事務只能看見已經提交的事務的修改結果。換句話說,乙個事務從開啟事務到提交事務之前,對其他事務都是不可見的,因此在同乙個事務中的兩次相同查詢結果可能不一樣。故這種隔離級別有時候也叫不可重複讀(nonrepeatable read)。

• read committed 實踐

"可重複讀"是mysql的預設事務隔離級別。repeatable read解決了髒讀的問題,該級別保證了在同一次事務中多次查詢相同的語句結果是一致的。但是"可重複讀"隔離級別無法避免產生幻行(phantom row)的問題,mysql的innodb引擎通過多版本併發控制(mvcc,multiversion concurrency controller)解決了幻讀的問題。

• repeatable read 產生幻行的實踐

從上面gif圖顯示的過程我們可以看到,最後session a查詢語句的結果只有一條id為1的資料,但是我們在插入id=2的資料的時候產生了報錯

error 1062 (23000): duplicate entry 『2』 for key 『primary』

從報錯中很容易就能看到是因為id=2的行已經存在了,前面讀取行資料的結果就是幻讀。

• repeatable read 實踐

serializable是最高的隔離級別,它通常通過強制事務序列,避免了前面說的幻讀問題。簡單來說,"可序列化"會在讀取的每一行資料上都加鎖,所以可能會導致大量的鎖等待和超時問題,所以在實際的生產環境中也很少會用到這個隔離級別,只有在非常需要確保資料的一致性切可以接受沒有併發的情況下,才會考慮使用這個隔離級別。

• serializable實踐

從上面的過程我們可以看到,"可序列化"是通過對每一行資料都加鎖的方式來避免幻行問題,這種方式效率非常的低,很容易造成較長時間的鎖等待。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL中的事務隔離級別

sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些不希望發生的現象是 乙個事務讀取了另乙個未提交的並行事務寫的資料。乙個事務重新讀取前面讀取過的資料,發現該資料已經被另乙個已提交的事務修改過。乙個事務重新執行乙個查詢,返回一套符合查詢條件的行,發現這些行因為其他最近提交的...

MySQL中的事務隔離級別

mysql中的事務隔離級別 收藏 sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些不希望發生的現象是 髒讀 dirty reads 乙個事務讀取了另乙個未提交的並行事務寫的資料。不可重複讀 non repeatable reads 乙個事務重新讀取前面讀取過的資料,發現...