事務隔離級別
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操作.
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 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