程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 如何以事物的方式對數據庫進行訪問

如何以事物的方式對數據庫進行訪問

編輯:Oracle數據庫基礎
一 事務的概念

  事務是由相關操作構成的一個完整的操作單元。兩次連續成功的COMMIT或ROLLBACK之間的操作,稱為一個事務。在一個事務內,數據的修改一起提交或撤銷,如果發生故障或系統錯誤,整個事務也會自動撤銷。

  Oracle的數據語音分為數據定義語言(DDL)、數據控制語言(DCL)和數據操縱語言(DML)。其中的DML語言會生成事務,其他兩種語言只要執行,事務就會結束。

  簡單的說DML語言可以建立事務,DDL和DCL不能建立事務。

  DML語言包括幾個命令,例如 select insert delete update等等,這些命令執行後,當前用戶的顯示信息是更改了,但是其他人訪問你改的表的時候數據並沒有更改,需要使用commit確認後才能更改。如果當前用戶在沒有執行commit前反悔操作了,那使用rollback命令可以回退到執行操縱語句之前,但是如果已經執行了commit語句是無法回退的。

  比如,我們去銀行轉賬,操作可以分為下面兩個環節:

  (1) 從第一個賬戶劃出款項。

  (2) 將款項存入第二個賬戶。

  在這個過程中,兩個環節是關聯的。第一個賬戶劃出款項必須保證正確的存入第二個賬戶,如果第二個環節沒有完成,整個的過程都應該取消,否則就會發生丟失款項的問題。整個交易過程,可以看作是一個事物,成功則全部成功,失敗則需要全部撤消,這樣可以避免當操作的中間環節出現問題時,產生數據不一致的問題。

  一個事務是由一個可執行的SQL語句開始,一個可執行SQL語句產生對實例的調用。在事務開始時,被賦給一個可用回滾段,記錄該事務的回滾項。一個事務以下列任何一個出現而結束。數據庫事務是一個邏輯上的劃分,有的時候並不是很明顯,它可以是一個操作步驟,也可以是多個操作步驟。

  我們可以這樣理解數據庫事物:對數據庫所做的一系列修改,在修改過程中,暫時不寫入數據庫,而是緩存起來,用戶在自己的終端可以預覽變化,直到全部修改完成,並經過檢查確認無誤後,一次性提交並寫入數據庫,在提交之前,必要的話所做的修改都可以取消。提交之後,就不能撤銷,提交成功後其他用戶才可以通過查詢浏覽數據的變化。

  以事務的方式對數據庫進行訪問,有如下的優點:

  * 把邏輯相關的操作分成了一個組。

  * 在數據永久改變前,可以預覽數據變化。

  * 能夠保證數據的讀一致性。

  二 數據庫事務的應用

  數據庫事務處理可分為隱式和顯式兩種。顯式事務操作通過命令實現,隱式事務由系統自動完成提交或撤銷(回退)工作,無需用戶的干預。

  隱式提交的情況包括:當用戶正常退出SQL*Plus或執行CREATE、DROP、GRANT、REVOKE等命令時會發生事務的自動提交。

  還有一種情況,如果把系統的環境變量AUTOCOMMIT設置為ON(默認狀態為OFF),則每當執行一條INSERT、DELETE或UPDATE命令對數據進行修改後,就會馬上自動提交。設置命令格式如下:

  SET AUTOCOMMIT ON/OFF

  隱式回退的情況包括:當異常結束SQL*Plus或系統故障發生時,會發生事務的自動回退。

  顯式事務處理的數據庫事務操作語句有3條,分別是COMMIT,ROLLBACK,SAVEPOINT語句。

  COMMIT是數據庫事物提交,將變化寫入數據庫。此操作把多個步驟對數據庫的修改,一次性地永久寫入數據庫,代表數據庫事務的成功執行。ROLLBACK是數據庫事務回退,撤銷對數據庫的修改。操作在發生問題時,把對數據庫已經作出的修改撤消,回退到修改前的狀態。在操作過程中,一旦發生問題,如果還沒有提交操作,則隨時可以使用ROLLBACK來撤消前面的操作。SAVEPOINT則用於在事務中間建立一些保存點,ROLLBACK可以使操作回退到這些點撤上邊,而不必撤銷全部的操作。一旦COMMIT完成,就不能用ROLLBACK來取消已經提交的操作。一旦ROLLBACK完成,被撤消的操作要重做,必須重新執行相關操作語句。

  如何開始一個新的事務呢?一般情況下,開始一個會話(即連接數據庫),執行第一條SQL語句將開始一個新的事務,或執行COMMIT提交或ROLLBACK撤銷事務,也標志新的事務的開始。另外,執行DDL(如CREATE)或DCL命令也將自動提交前一個事務而開始一個新的事務。

  數據在修改的時候會對記錄進行鎖定,其他會話不能對鎖定的記錄進行修改或加鎖,只有當前會話提交或撤銷後,記錄的鎖定才會釋放。

  例如修改雇員SCOTT的工資,工資在原有基礎上增加1000:

  UPDATE emp SET sal=sal+1000 WHERE empno=7788;

  執行結果:

  已更新 1 行。

  顯示修改後SCOTT的工資:

  SELECT ename,sal FROM emp WHERE empno=7788;

  執行結果:

  ENAME SAL

  SCOTT 4000

  經查看修改結果正確,提交所做的修改:

  COMMIT;

  執行結果:

  提交完成。

  在執行COMMIT後,工資的修改被永久寫入數據庫。本訓練的第1步,先使用COMMIT命令提交原來的操作,同時標志一個新的事務的開始。注意:在事務執行過程中,隨時可以預覽數據的變化。對於比較大的事務,可以使用SAVEPOINT命令在事務中間劃分一些斷點,用來作為回退點。

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