ORACLE數據庫事務隔離級別

事務隔離級別:一個事務對數據庫的修改與並行的另一個事務的隔離程度。

兩個併發事務同時訪問數據庫表相同的行時,可能存在以下三個問題:

1、幻想讀:事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻想。

2、不可重複讀取:事務T1讀取一行記錄,緊接着事務T2修改了T1剛剛讀取的記錄,然後T1再次查詢,發現與第一次讀取的記錄不同,這稱爲不可重複讀。

3、髒讀:事務T1更新了一行記錄,還未提交所做的修改,這個T2讀取了更新後的數據,然後T1執行回滾操作,取消剛纔的修改,所以T2所讀取的行就無效,也就是髒數據。

 

爲了處理這些問題,SQL標準定義了以下幾種事務隔離級別

READ UNCOMMITTED 幻想讀、不可重複讀和髒讀都允許。

READ COMMITTED 允許幻想讀、不可重複讀,不允許髒讀

REPEATABLE READ 允許幻想讀,不允許不可重複讀和髒讀

SERIALIZABLE 幻想讀、不可重複讀和髒讀都不允許

 

Oracle數據庫支持READ COMMITTED 和 SERIALIZABLE這兩種事務隔離級別。所以Oracle不支持髒讀

SQL標準所定義的默認事務隔離級別是SERIALIZABLE,但是Oracle 默認使用的是READ COMMITTED

 

設置隔離級別使用:

SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

下面是oracle 設置SERIALIZABLE隔離級別一個示例:(查看附近)

 

左面是事務T1,右面是事務T2,因爲T2級別爲SERIALIZABLE,所以即使事務T1在提交了數據之後,事務T2還是看不到T1提交的數據,幻想讀和不可重複讀都不允許了。

那如何能查看到T1新增的記錄呢? 上面T1和T2是併發執行,在T1執行insert的時候事務T2已經開始了,因爲T2級別是SERIALIZABLE,所以T2所查詢的數據集是T2事務開始前數據庫的數據。即事務T1在事務T2開始之後的insert和update操作的影響都不會影響事務T2。現在重新開啓一個事務T3 就可以看到T1新增的記錄了。

當下列事件發生時,事務就開始了:

1、連接到數據庫,並執行第一條DML語句

2、前一個事務結束後,又輸入了另一條DML語句

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章