1. 程式人生 > >數據庫隔離級別

數據庫隔離級別

div gre set oba blog 隔離級別 事務 rep pre

定義

SQL標準定義了4種隔離級別,用來限定事務的哪些改變是可見的,哪些是不不可見的,一般來低級別的隔離級別支持更高的並發,並擁有更低的系統開銷。

四種隔離級別

未提交讀(Read Uncommitted)

  • 解釋:所有的事務都可以看到其他無論是提交還是未提交事務的執行結果

  • 帶來問題:會出現臟讀現象(讀取到別人未提交的數據)。

  • 解決問題:不能解決任何問題,其實對系統的開銷、並發性也一般。

提交讀(Read Committed)

  • 解釋:讀到的數據是其他事務提交之後的數據

  • 帶來問題:這個級別會出現不可重復讀現象(在同一個事務裏,前後兩次相同的select會讀到不同的結果)

  • 解決問題:==這是大多數數據庫默認的隔離級別(mysql innodb事務的隔離級別默認是可重復讀)==,該級別是可以解決臟讀的現象。

可重復讀(Repeatable Read)

  • 解釋:在同一個事務裏,select結果是事務開始時間點的狀態,同樣的SELECT操作讀到的結果會是一致的。

  • 問題:會出現幻讀數據(幻讀指當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行),這時候就需要用串行讀隔離級別了。

  • 解決問題:可解決不可重復讀的問題,因為這個級別是對行數據鎖定,在這個事務裏數據,其他的事務對該數據不能修改,但可以插入,從而出現了幻讀的情況。

  • 幻讀可不可重復讀的區別就是,幻讀是對數據的新增或者刪除,不可重復讀是數據的修改。不可重復讀、幻讀都是使用悲觀鎖的機制來處理這兩種問題,但是MySQL、ORACLE、PostgreSQL等成熟的數據庫,出於性能考慮,都是使用了以樂觀鎖為理論基礎的MVCC(多版本並發控制)來避免這兩種問題。

串行讀(Serializable)

解釋:讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥。

附圖一張:
技術分享圖片

隔離級別設置(mysql)

查看InnoDB存儲引擎 系統級的隔離級別 和 會話級的隔離級別
select @@global.tx_isolation,@@tx_isolation;

更改會話級的隔離級別

set session tx_isolation=‘read-uncommitted‘;  

更改系統級的隔離級別

set session tx_isolation=‘read-uncommitted‘;  

數據庫隔離級別