Oracle-事務隔離級別

xulongxc發表於2014-03-11

隔離級別(isolation level),是指事務與事務之間的隔離程度。

 

顯然,事務隔離程度越高,併發性越差、效能越低;事務隔離程度越低,併發性越強、效能越高。

 

ANSI/ISO SQL92標準中定義了4種事務隔離級別:

 

1.       序列化(serializable)

最高隔離級別。系統中所有的事務都是一個接一個執行的。因此也就不會發生任何事務之間的衝突問題。

 

2.       可重複讀(repeatable read)

一個事務所讀取的資料記錄不允許被其他事務所修改。

 

3.       讀已提交(read committed)

該級別允許其他事務修改當前事務所讀取的資料記錄,並且那個事務提交之後,當前事務可以看到修改後的資料。

 

4.       讀未提交(read uncommitted)

該級別允許其他事務修改當前事務所讀取的資料記錄,並且那個事務尚未提交時,當前事務就可以看到修改後的資料。即允許髒讀。

 

事務隔離級別不同,執行一條資料庫查詢,得到的結果很可能讓你感到意外,下面是這些情況的總結:

 

1.       髒讀

讀取了其他事務還沒有提交的資料。

 

2.       不可重複讀

當前事務已經讀取的資料記錄,被其他事務修改或刪除。

 

3.       幻影讀

其他事務插入了新的資料,當前事務以相同的查詢條件,在那個事務插入資料之前和之後查詢資料,得到的資料記錄的條數不一樣。

 

隔離級別

髒讀

不可重複讀

幻影讀

序列化

N

N

N

可重複讀

N

N

Y

讀已提交

N

Y

Y

讀未提交

Y

Y

Y

 

Oracle明確支援ANSI/ISO SQL92中定義的serializable和read committed兩種事務隔離級別。

 

同時,Oracle還提供了自己獨有的事務隔離級別:read only。

 

所以,可以說Oracle共支援3種事務隔離級別:

 

1.       serializable

2.       read committed

3.       read only

 

Oracle預設的隔離級別是read committed。

檢視資料庫隔離級別的方法:

1.  SELECT * FROM dual FOR UPDATE;

2. SELECT s.sid, s.serial#,
   CASE BITAND(t.flag, POWER(2, 28))
          WHEN 0 THEN 'READ COMMITTED'
          ELSE 'SERIALIZABLE'
       END AS isolation_level
    FROM v$transaction t
    JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

修改資料庫隔離級別的方法:

設定隔離級別使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29440247/viewspace-1107190/,如需轉載,請註明出處,否則將追究法律責任。

相關文章