程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle事物隔離級別

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

2 基本語法:

savepoint 保存點名稱

………………

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

2 說明:

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

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

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

5、 事務隔離級別

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

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

2 並發操作引起的錯誤

(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; --兩次查詢的記錄不同

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

隔離級別

髒讀

不可重復讀

幻讀

讀未提交(read uncommitted)

讀已提交(read committed)

×

可重復讀(repeatable read)

×

×

可串行化(serializable)

×

×

×

6、Oracle的事務隔離級別

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

2 Oracle的readcommitted說明

(1) 這是oracle缺省的事務隔離級別

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

2 Oracle的serializable說明

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

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

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

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

2 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、可串行化

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

注意:sys用戶不能運行Set transaction isolation level serializable。

2 舉例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 舉例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; --沒有發生幻讀,插入記錄對其沒起作用


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved