SQL的事務( 四 )

。
在SQL官方標準中,設立了以下四個隔離級別:
1. 讀未提交(Read Uncommitted)在該隔離級別中,所有事務都可以看到其它未提交事務的執行結果,意味著會發生臟讀、不可重復讀幻讀 。
2. 讀已提交(Read Committed)讀已提交滿足了隔離的基本定義:一個事務只能看見已經提交的事務的執行結果 。這是大部分數據庫系統的默認隔離級別 , 比如Oracle、SQL Server,可以避免臟讀,但仍會發生不可重復讀,幻讀 。
3. 可重復讀(Repeatable Read)事務A在讀到一條數據之后,此時事務還沒提交或回滾,接著事務B對該數據進行了修改并提交,那么事務A再次讀取該數據,讀到的還是原來的內容 。可以避免臟讀、不可重復讀,但仍會發生幻讀,這是MySQL默認的隔離級別 。
4. 可串行化(Serializable)確保事務可以從一個表中讀取相同的行,在整個事務持續期間 , 禁止其它事務對該表相同行進行插入、更新,刪除操作 。所有的問題都可以解決 , 但性能最為低下 。
SQL標準的四種隔離級別分別可能出現的并發問題

臟寫臟讀不可重復讀幻讀加鎖讀Read Uncommitted×√√√×Read Committed××√√×Repeatable Read×××√×Serializable××××√5.4 不同數據庫的隔離級別SQL標準雖然有4種隔離級別,但不同的數據庫的支持程度不一樣 。

OracleMySQLSQL ServerRead Uncommitted×√√Read Committed√(默認)√√(默認)Repeatable Read×√(默認)√Serializable√√√Snapshot

√Read Committed Snapshot

√值得注意的是:

  1. MySQL 的實現 Repeatable Read 在一定程度上也可以解決幻讀的問題(快照讀+MVCC機制),與SQL官方標準略有區別;
  2. SQL Server 支持的隔離級別比SQL標準的還要多出兩種 。
5.5 其它MySQL中查看隔離級別:
# 5.7.20之前SHOW VARIABLES LIKE 'tx_isolation';# 5.7.20及之后SHOW VARIABLES LIKE 'transaction_isolation';# 所有版本均可用SELECT @@transaction_isolation;MySQL中設置隔離級別:
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔離級別';隔離級別可選項:> READ-UNCOMMITTED> READ-COMMITTED> REPEATABLE-READ> SERIALIZABLE或者:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL '隔離級別';隔離級別可選項:> READ UNCOMMITTED> READ COMMITTED> REPEATABLE READ> SERIALIZABLE
GLOBAL:對后續所有新開會話有效
SESSION:只對當前會話有效
無論設置什么級別,數據庫一旦重啟都以配置文件為準
【SQL的事務】

推薦閱讀