Oracle事務處理


什么是事務:
 在數據庫中事務是工作的邏輯單元,一個事務是由一個或多個完成一組的相關行為的SQL語句組成,通過事務機制確保這一組SQL語句所作的操作要么完全成功執行,完成整個工作單元操作,要么一點也不執行。
   主要作用:確保數據庫的完整性。
 
二、事務的特性(ACID)
  對一組SQL語句操作構成事務,數據庫操作系統必須確保這些操作的原子性,一致性,隔離性,持久性.
1、原子性(Atomicity)
    事務的原子性是指事務中包含的所有操作要么全做,要么不做,也就是說所有的活動在數據庫中要么全部反映,要么全部不反映,以保證數據庫的一致性。
2、一致性(Consistency)
    事務的一致性是指數據庫在事務操作前和事務處理后,其中數據必須滿足業務的規則約束。
3、隔離性(Isolation)
   隔離性是指數據庫允許多個並發的事務同時對其中的數據進行讀寫或修改的能力,隔離性可以防止多個事務的並發執行時,由於它們的操作命令交叉執行而導致數據的不一致性。
4、持久性(Durability)
    事務的持久性是指在事務處理結束后,它對數據的修改應該是永久的。即便是系統在遇到故障的情況下也不會丟失,這是數據的重要性決定的。
 
、事務的控制語句
   在oracle數據庫中,沒有提供開始事務處理語句,所有的事務都是隱式開始的,也就是說在oracle中,用戶不可以顯示使用命令來開始一個事務.oracle任務第一條修改數據庫的語句,或者一些要求事務處理的場合都是事務的隱式開始。但是當用戶想要終止一個事務處理時,必須顯示使用commit和rollback語句結束。
  根據事務ACID屬性,oracle提供了如下的事務控制語句:
   Set transaction --> 設置事物屬性
   Set constrains  --> 設置事物的約束模式
   約束模式是指:在事務中修改數據時,數據庫中的約束立即應用於數據,還是將約束推遲到當前事務結束后應用。
   Savepoint --> 在事務中建立一個存儲的點.當事務處理發生異常而回滾事務時,可指定事務回滾到某存儲點.然后從該存儲點重新執行。
   Release  savepoint --> 刪除存儲點
   Rollback 回滾事務 -->  取消對數據庫所作的任何操作
   Commit 提交事務  -->   對數據庫的操作做持久的保存。
 
1、設置事物的屬性:
  set transaction語句可用來設置事物的各種屬性。該語句必須放在事務處理的第一個語句.也就是說,必須在任何insert、update 、delete語句以及其他的事務處理之前。
  Set transaction的語句可以讓用戶對事務的以下屬性進行設置
  A、指定事務的隔離層
  B、規定回滾事務所使用的存儲空間
  C、命名事務
 注意:在使用set transaction語句設置屬性時,對於規定回滾事務所使用的存儲空間的設置很少使用.對於命名事務也非常簡單,只有在分布式事務處理中才會體現出命名事務的用途.
 
  • 特別說明:set transaction只對當前事務有效,事務終止,事務當前的設置將會失效。
(1) 數據異常
事務的隔離性定義了一個事務與其它事務的隔離程度.為了更好的理解隔離層,首先討論一下並發事務對同一個數據庫進行訪問可能發生的情況.在並發事務中總體來說會發生如下3種情況
    錯讀 |臟讀
  非重復讀取|不可重復讀
  假讀|幻讀
 
  錯讀|臟讀:當一個事務修改數據時,另一事務讀取了該數據,但是第一事務由於某種原因取消對數據修改,使數據返回了原狀態,這是第二個事務讀取的數據與數據庫中數據不一致.這就叫錯讀。
 
  非重復讀取:是指一個事務讀取數據庫中的數據后,另一個事務則更新了數據,當第一個事務再次讀取其中的數據時,就會發現數據已經發生了改變,這就是非重復讀取。非重復讀取所導致的結果就是一個事務前后兩次讀取的數據不相同。
 
   假讀:如果一個事務基於某個條件讀取數據后,另一個事務則更新了同一個表中的數據,這時第一個事務再次讀取數據時,根據搜索的條件返回了不同的行,這就是假讀。
 
   事務中遇到的這些異常與事務的隔離性設置有關,事務的隔離性設置越多,異常就出現的越少,但並發效果就越低,事務的隔離性設置越少,異常出現的越多,並發效果越高。
(2) 選擇隔離層
   針對3中讀取的數據時產生的不一致現象,在ANSI SQL標准92中定義了4個事務的隔離級別.如下圖所示:
 
隔離層
錯讀|臟讀
非重復讀取|不可重復讀
假讀|幻讀
READ UNCOMMITTED(非提交讀)
READ COMMITTED(提交讀)
Repeatable READ(可重復讀)
Serializable(串行讀)
 
Oracle支持上述四種隔離層中的兩種:read committed serializable。除此之外oralce中還定義read only read write隔離層。
 Read committed: 這是oracle默認的隔離層。
Serializable:事務與事務之間完全隔開,事務以串行的方式執行,這並不是說一個事務必須結束才能啟動另外一個事務,而是說這些事務的執行的結果於一次執行的事務的結果一致。
 
Read only和 read write 當使用read only時,事務中不能有任何修改數據庫中數據的操作語句,這包括 insert、update、delete、create語句。Read only是serializable的一個子集,區別是read only 只讀,而serialzable可以執行DML操作。Read write它是默認設置,該選項表示在事務中可以有訪問語句、修改語句.但不經常使用.
(3)建立set transaction的語句
 列舉如下:
    Set transaction read only
    Set transaction read write
    Set transaction isolation level read committed
    Set transaction isolation level serializable
注意:這些語句是互斥的.即不能夠同時設置兩個或者兩個以上的選項。
 (4) 結束事務:什么情況下代表事務的結束呢?
     (1)commit 提交事務
     (2)rollback 回滾事務 
 
示例一:設置只讀
   
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM