1. 程式人生 > >Oracle 事物隔離級別

Oracle 事物隔離級別

  

1、事務介紹

Oracle11g中的事務是隱式自動開始的,不需要使用者顯示的執行開始事務語句。但對於事務的結束處理,則需要使用者進行指定的操作。通常在以下情況下,Oracle認為一個事務結束了。

(1)  執行Commit語句提交事務

(2)  執行Rollback語句撤銷事務

(3)  執行一條資料定義語句。如果該語句執行成功,那麼oracle系統會自動執行commit命令;否則,系統會自動執行Rollback命令。

(4)  執行一個數據控制命令,當語句執行完畢,oracle系統會自動執行commit命令。

(5)  正常的斷開資料庫的連線、正常的退出sqlplus環境,那麼oracle系統會自動執行commit命令;否則,系統會自動執行Rollback命令。

2、Commit語句

Commit代表提交事務,oracle系統內部會按照如下順序進行處理:

(1)  首先在回滾段內記錄當前事務已提交,並且宣告一個唯一的系統編號(SCN),以唯一標識這個事務。

(2)  然後啟動後臺的日誌寫入程序(LGWR),將SGA區的重做日誌緩衝區中的資料和當前事務的SCN寫入重做日誌檔案中。

(3)  接著Oracle伺服器開始釋放事務處理所使用的系統資源。

(4)  最後顯示通知,告訴使用者事務已經成功提交完畢。

3、Rollback語句

Rollback代表撤銷事務,oracle系統內部會按照如下順序進行處理:

(1)   首先使用回滾段中的資料撤銷對資料庫所做的修改。

(2)   然後Oracle後臺伺服器程序釋放掉事務所使用的系統資源。

(3)   最後顯示通知,告訴使用者事務已經撤銷成功。

4、儲存點

Oracle不僅允許回退整個未提交的事務,還允許回退事務的一部分,這個可以通過“儲存點”來完成。在事務的執行過程中,使用者可以通過建立儲存點將一個較長的事務分隔為幾部分。這樣使用者就可以有選擇性的回退到某個儲存點,並且該儲存點之後的操作都將被撤銷。

²     基本語法:

savepoint 儲存點名稱

           ………………

           Rollback to 儲存點名稱  或  rollback --撤銷全部事務

²     說明:

(1)         一個事務中可以儲存多個儲存點,不能2次回退到同一儲存點,一旦回退過一次,儲存點就失效了。

(2)         儲存點的設定代價是有資源開銷的。

(3)         一旦提交了事務,則不能回退到任何儲存點。

5、 事務隔離級別

²     說明:事務隔離級別由國際標準化組織定義,不是所有的DBMS都遵循。

²     簡介:事務隔離級別定義了事務與事務之間的隔離程度。隔離級別與併發性是相互矛盾的。隔離程度越高,資料庫的併發性越差;隔離程度越低,資料庫的併發性越好。

²     併發操作引起的錯誤

(1)         髒讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生髒讀。(oracle中無此現象)

(2)         不可重複讀(nonrepeatable read):同一查詢在同一事務中多次進行,由於其他提交事務所做的修改和刪除,每次返回不同的結果集,此時發生不可重複讀。

例如:

Insert into emp(empno,ename) values(9000, '李明')

Sqlplus  2: select * from emp; 

      Sqlplus  1: delete from emp where empno=9000

                  Commit

      Sqlplus 2: select * from emp; --兩次查詢的記錄不同

(3)         幻讀(phantom read):同一查詢在同一事務中多次進行,由於其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻讀。

例如:

  Sqlplus  2: select * from emp; 

     Sqlplus 1:  Insert into emp(empno, ename)values(9999, '李亮');

                 Commit;

     Sqlplus 2: select * from emp; --兩次查詢的記錄不同

²  事務隔離級別的概念:隔離級別定義了事務與事務之間的隔離程度

隔離級別

髒讀

不可重複讀

幻讀

讀未提交(read uncommitted)

讀已提交(read committed)

×

可重複讀(repeatable read)

×

×

可序列化(serializable)

×

×

×

6、Oracle的事務隔離級別

   Oracle提供了SQL92標準中的read committed和serializable,同時提供了非SQL92標準的read-only。read-only是serializable的子集,它們都避免了非重複讀和幻讀,區別是read-only中不允許sql進行DML操作。

²     Oracle的readcommitted說明

(1)         這是oracle預設的事務隔離級別

(2)         保證不會髒讀:但可能出現不可重複讀和幻讀

²     Oracle的serializable說明

(3)         使事務看起來像是一個接著一個順序的執行

(4)         僅僅能看到本事務開始前由其他事務提交的更改和在本事務中所做的更改

(5)         保證不會出現髒讀、不可重複讀和幻讀

(6)         提供了read-only事務所提供的讀一致性,同時又允許DML操作

²  Oracle的事務隔離級別設定

(1)         設定一個事務的隔離級別

Set transaction isolation level readcommitted; --(預設)

Set transaction isolation levelserializable; --代價比較高昂

Set transaction read only;

(2)         設定整個會話的隔離級別

Alter session set isolation_level=serializable;

Alter session set isolation_level=readcommitted;

7、可序列化

²  介紹:可序列化就是使事務看起來像是一個接著一個順序執行。事務在開始前對資料庫中的所有資料拍了一個快照,在事務執行過程中僅能看到這個快照中的資料和在本事務中所做的更新。

注意:sys使用者不能執行Set transaction isolation level serializable。

²  舉例1:

Sqlplus  2:  Settransaction isolation level serializable; --用commit保證它是事務第一條語句

           Select * from emp;

Sqlplus  1: select * from emp;

          Delete from emp where empno=9999;

          Commit;

Select * from emp;

Sqlplus  2: Select * from emp; --沒有發生不可重複讀,刪除記錄對其沒起作用

²  舉例2:

Sqlplus  2:  Settransaction isolation level serializable;

           Select * from emp;

Sqlplus  1: select * from emp;

          Insert into emp(empno, ename)values(9998, '王明')

          Commit;

Select * from emp;

Sqlplus  2: Select * from emp; --沒有發生幻讀,插入記錄對其沒起作用