資料庫交易
概要
資料庫交易通常包含了一個序列的對資料庫的讀/寫操作。包含有以下兩個目的:
- 為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。
- 當多個應用程式在並行訪問資料庫時,可以在這些應用程式之間提供一個隔離方法,以防止彼此的操作互相干擾。
當交易被提交給了資料庫管理系統(DBMS),則DBMS需要確保該交易中的所有操作都成功完成且其結果被永久儲存在資料庫中,如果交易中有的操作沒有成功完成,則交易中的所有操作都需要轉返,回到交易執行前的狀態;同時,該交易對資料庫或者其他交易的執行無影響,所有的交易都好像在獨立的執行。
例子
某人要在商店使用電子貨幣購買100元的東西,當中至少包括兩個操作:
- 該人帳戶減少100元
- 商店帳戶增加100元
支援交易的資料庫管理系統(transactional DBMS)就是要確保以上兩個操作(整個「交易」)都能完成,或一起取消;否則就會出現100元平白消失或出現的情況。
但在現實情況下,失敗的風險很高。在一個資料庫交易的執行過程中,有可能會遇上交易操作失敗、資料庫系統/作業系統出錯,甚至是儲存媒介出錯等情況。這便需要DBMS對一個執行失敗的交易執行恢復操作,將其資料庫狀態恢復到一致狀態(數據的一致性得到保證的狀態)。為了實現將資料庫狀態恢復到一致狀態的功能,DBMS通常需要維護交易紀錄檔以追蹤交易中所有影響資料庫數據的操作[1][2]。
ACID性質
並非任意的對資料庫的操作序列都是資料庫交易。資料庫交易擁有以下四個特性,習慣上被稱之為ACID特性。
SQL
SQL國際標準使用START TRANSACTION
開始一個交易(也可以用方言命令BEGIN
)。COMMIT
陳述式使交易成功完成。ROLLBACK
陳述式結束交易,放棄從BEGIN TRANSACTION
開始的一切變更。若autocommit被START TRANSACTION
的使用禁止,在交易結束時autocommit會重新啟用。
關係型資料庫
關係型資料庫傳統上是由具有固定大小的欄位和記錄的表組成。對象資料庫由可變大小的blobs(二進制大對象)組成,可能是可序列化的,也可能是結合了MIME類型的。關係型資料庫和對象型資料庫的基本相似之處是start, commit或rollback。
在啟動交易後,資料庫記錄或對象會被鎖定, 唯讀,或讀寫。然後才可以進行讀寫操作。一旦交易完全完成,變化就會被原子性地提交或轉返,這樣在交易結束時就不會出現不一致的情況。
分散式交易
資料庫系統實現分散式交易是指在多個節點上訪問數據的交易。一個分散式交易在多個節點上執行ACID屬性,可能包括資料庫、儲存管理器、檔案系統、訊息系統和其他數據管理器等系統。在一個分散式交易中,通常有一個實體協調所有的過程,以確保交易的所有部分都適用於所有相關系統。
參考文獻
- ^ Elmasri Navathe著,張伶等譯. 《数据库系统基础(第四版)》(Fundamentals of Database System (Fourth Edition)). 中國電力出版社. 2005年8月: 436頁. ISBN 7-5083-3496-5.
- ^ Jim Gray, Andreas Reuter 著,孟小峰、於戈 等譯. 《事务处理:概念与技术》(Transaction Prossessing: Concepts and Techniques). 機械工業出版社. 2004年. ISBN 9787111126416.
- ^ 3.0 3.1 3.2 3.3 王能斌. 《数据库系统教程(上册)》. 電子工業出版社. 2002年8月: 91~92頁. ISBN 7-5053-7827-9.