Oracle事務隔離級別


事務隔離級別

1.髒讀

當一個事務讀取另一個事務尚未提交的修改時,產生髒讀,在oracle中,不存在髒讀.

2.不可重複讀

在同一個事務中的同一個查詢,如果因爲別的事務修改或者刪除,造成本事務查詢的結果不一致.

3.幻讀

在同一個事務中的同一個查詢,因爲別的事務添加,造成本事務查詢的結果不一致.


temp表有14條數據

控制檯1   刪除014號數據

控制檯2   刪除013號數據

控制檯2   commit

控制檯1   查詢數據爲12條 013,014數據被刪除

控制檯2   查詢數據爲13條 013數據被刪除

控制檯1   commit

控制檯1,2  查詢數據爲12條 013,014數據被刪除     

以上爲兩個控制檯交互修改查詢數據庫,控制檯1在進行中時,控制檯2修改刪除了數據,commit後,在控制檯1可以發現數據被更新

可以發現並不是事務1開始執行語句(沒有commit),事務2就必須等待事務1commit纔可以DML操作.


在Oracle中,存在所謂的回滾段(Oracle9i之前版本)或撤銷段(Oracle9i版本),Oracle在修改數據記錄時,會把這些記錄被修改之前的結果存入回滾段或撤銷段中.


Read Committed

Oracle缺省的設置是Read Committed隔離級別

保證不會出現髒讀,但可能出現不可重複讀和幻讀.


Serializable

保證不會出現髒讀,不可重複讀和幻讀.

在Serializable隔離級別,事務中的讀取操作只能讀取這個事務開始之前已經提交的數據結果


Serializable 中的死鎖

開始事務1,運行:
set transaction isolation level serializable;
select * from customer where State = 'CA';        --set tran語句隱式開始事務
得到1條記錄,然後事務2開始運行:
set transaction isolation level serializable;
update customer set state = 'KO' where state = 'CA';
commit;
可以發現事務2立刻完成,沒有阻塞。回到事務1繼續:
select * from customer where State = 'CA';
update Customer set city = 'garden' where state = 'CA';
commit;
出現錯誤信息:
第 1 行出現錯誤:
ORA-08177: 無法連續訪問此事務處理
總的來說,oracle利用多版本的方式實現串行化級別更少造成死鎖,除非兩個事務修改了相同的數據行,一般也不會造成衝突。


 Read only

set transaction read only;

 只讀事務是指只允許執行查詢的操作,而不允許執行任何其它dml操作的事務,使用只讀事務可以確保用戶只能取得某時間點的數據。假定機票代售點每天18點開始統計今天的銷售情況,這時可以使用只讀事務。在設置了只讀事務後,儘管其它會話可能會提交新的事務,但是隻讀事務將不會取得最新數據的變化,從而可以保證取得特定時間點的數據信息。

例:有個機票代售系統,管理員要在每天18:00統計賣出多少票,但是在統計時,不能把該事務鎖定,也就是別人還可以買票,這時就需要使用只讀事務。

例:用戶 system 登錄,首先 set transaction read only; 用戶 scott 登錄,執行 select * from emp; 此時有14條記錄,然後執行 insert into emp values (8888, 'skycloud', 'CLERK', 7900, to_date('1987-12-12', 'yyyy-mm-dd'), 500, 0, 10); 此時執行 select * from emp; 顯示15條記錄,但是用戶 system 執行 select * from scott.emp; 仍然是14條記錄。


Set transaction語句的作用週期

設置事務的隔離級別:

Set Transaction Isolation Level Read Committed(默認)

Set Transaction Isolation Level Serializable(手動)

Set Transaction Read only;

作用週期爲整個事務.

設置會話的隔離級別:

Alter Session Set Isolation_Level Read Committed

Alter Session Set Isolation_LevelSerializable



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章