1. 程式人生 > >Oracle資料庫(十五)——事務和鎖——確保資料安全上

Oracle資料庫(十五)——事務和鎖——確保資料安全上

事務和鎖是兩個聯絡非常緊密的概念,它們保證了資料庫的一致性。由於資料庫是一個可以由多個使用者共享的資源,因此當多個使用者併發的存取資料時,就要保證資料的準確性。事務和鎖就完成了這項功能。

什麼是事務

事務在資料庫中主要用於保證資料的一致性,防止出現錯誤資料。在事務內的語句都會被看成一個單元,一旦有一個失敗,所有的都會失敗。

事務就是一組包含一條或多條語句的邏輯單元,沒個事務都是一個原子單位,在事務中的語句被作為一個整體,要麼一起被提交,作用在資料上,使資料庫資料永久的修改,要麼一起被撤銷,對資料庫不做任何修改。

對於這個問題比較經典的例子就是銀行賬戶間的回饋操作。

  • 源賬戶減少儲存金額,例如減少1000
  • 目標賬戶增加儲存金額,增加1000
  • 在事務日誌中記錄該事務

整個交易過程,我們看做一個事務,如果操作失敗,那麼事務就會回滾,所有操作就會撤銷。

事務在沒有提交之前可以回滾,而且在提交前使用者可以檢視已經修稿的資料,但其他使用者檢視不到該資料,一旦資料提交就不能再撤銷修改了。Oracle的事務基本控制語句有如下幾個:

  • SET TRANSACTION: 設定事務的屬性
  • COMMIT 提交事務
  • SAVEPOINT 設定儲存點
  • ROLLBACK 回滾事務
  • ROLLBACK TO SAVEPOINT 回滾至儲存點

事務的型別

顯示方式:利用命令去完成

新事務的開始
sql statement
...
COMMIT | ROLLBACK;

隱式方式:該型別沒有明確的開始和結束,它由資料庫自動開啟,當一個程式正常結束或使用DDL語言時會自動提交,而操作失敗時也會自動回滾,如果設定AUTOCOMMIT為開啟狀態,每次DML操作都會自動提交。

SET AUTOCOMMIT ON/OFF

事務的儲存點

在事務中可以根據自己的需要設定儲存點,儲存點可以設定在事務中的如何地方,也可以設定多個點,這樣就可以把比較長的事務根據需要分成較小的段。一旦把事務回滾到某個儲存點後,Oracle將把儲存點之後 持有的鎖釋放掉,這時先前等待被鎖資源的事務就可以繼續了。而使事務回滾到儲存點,有幾點需要了解

  • 事務只回滾儲存點之後的操作
  • 回滾到某儲存點時,它一行的儲存點將被刪除,但儲存點會被保留
  • 儲存點之後的鎖將被釋放,但之前的會被保留
INSERT INTO PRODUCTINFO VALUES('1','儲存點測試1',1000,0,00000000,NULL,'測試');

SAVEPOINT FST;

INSERT INTO PRODUCTINGO VALUES('1','儲存點測試2',1000,0,00000000,NULL,'測試');

ROLLBACK FST;

事務的ACID特性

  • 原子性:不可分割,是一個整體,同時成功和撤銷
  • 一致性:事務執行前後資料庫都必須處於一致性狀態,只有在事務完成後才能被所有使用者看見
  • 分離性:事務之間不能互相的干擾
  • 永續性:永續性是指一旦事務提交完成,對資料庫就是永久的修改

tips:事務提交很重要,但不建議頻繁的提交事務,因為每次提交事務都需要時間。