事务处理

在計算機科學中，_事務_是無法被分割的操作，**事務處理**就是被分割為個體的信息處理。事務必須作為一個完整的單元成功或失敗，不可能存在部分完成的事務。

例如，當你在網上書店購買了一本書，你用錢換了一本書（以信貸的方式）。如果你的信用是好的，一系列相關的操作會確保你拿到書並且書店會收到你的錢。然而，在交易時如果在那一系列操作中的單個操作執行失敗，整個交易就會失敗。你拿不到書，書店也不會收到你的錢。負責交易的平衡和可預測的技術就叫做事務處理。事務確保在事務型的單元中的所有操作成功完成之前，面向數據的資源不會被永久更新。通過將那些成功完成或是完成失敗的一組相關操作集中到一個單元中，能夠簡化錯誤恢復並使應用變得更加可靠。

事務處理系統包括託管面向事務的應用的計算機硬體和軟體，其執行進行業務所必需的例行事務。例如，管理銷售訂單條目，航班預訂，工資單，雇員記錄，製造業和船舶的系統。

由於大多數，儘管未必是全部，當今的事務處理是交互的，因此經常被當作是在線事務處理的同義詞。

## 說明

事務處理是被設計用來維持系統的完整性（通常是一個資料庫或是一些現代的文件系統）在一個已知的，一致的狀態。具體過程是通過確保系統中的獨立操作全部成功完成或是全部成功取消。

例如，有一個典型的銀行事務要把 $700 從一個顧客的存款中移動到顧客的支票帳戶中。這個事務包括兩個單獨的計算機操作：從存款帳戶中取出 $700，在支票帳戶中存入 $700。如果一個操作成功，另一個沒有，那銀行的帳目到最後也不會平衡。因此必須有一種方法來確保兩個操作都成功或者都失敗，這樣銀行的資料庫中就沒有任何的不一致性。

事務處理連接單個不可分割的事務中的多個單獨的操作，並且確保事務中的所有操作都沒有錯誤或是沒有操作。如果一些操作完成但其他操作在完成時發生了錯誤，事務處理系統會「回滾」事務的所有操作（包括成功的那些），從而消除所有事務的痕跡並將系統恢復到之前處理事務開始時的一致，已知的狀態。如果事務的所有操作被成功完成，事務會被系統提交，所有資料庫中的改變變為永久性的；一旦這個操作完成事務不能再被回滾。

預防硬體和軟體錯誤的事務處理可能會讓一個事務部分完成，如果計算機系統在事務中間崩潰，事務處理系統會保證所有未被提交的事務中的操作會被中止。
通常來說，事務並發發行的。如果他們重疊（例如需要接觸資料庫的同一部分），就會導致衝突。例如，如果上述銀行例子中的顧客在他的存款帳戶中有 $150 並嘗試在同時將 $100 轉帳給另一個人和將 $100 轉到支票帳戶，只有其中的一個行為能夠成立。然而，迫使事務順序處理是低效的。因此，事務處理的並發實施被編程保證最終結果反映了一個沒有衝突的結局，如果以任何順序執行事務也能得到同樣的結果（一種叫做 [可串行性] 的屬性）。在我們的例子中，它表明無論哪個事務第一個發生，轉帳給另一個人成功或是將錢轉到支票帳戶成功，則另一個將會失敗。

## 方法論

所有事務處理系統的基本原理都是一樣的。然而術語可以從一個事務處理系統到另一個事務處理系統而變化。下面所用的術語未必都是通用的。

### 回滾

事務處理系統通過記錄資料庫改動時的中間狀態來確保資料庫的完整性，然後用這些將資料庫恢復到已知的狀態如果事務沒有成功提交。例如，數據中信息的副本的優先級高於它的改動信息因為在事務做出任何改動之前會被系統晾在一邊（這有時被叫做前映像）。如果在事務被提交之前，他的任一部分出現了問題，那些副本將會被用來恢復資料庫到事務剛剛開始的狀態。

### 前滾

為所有對資料庫管理系統的改動持續記錄成為一份單獨的日誌也是可能的（有時被稱為後映像）。他對於失敗事務的回滾來說不是必需的，但是在資料庫故障事件中對修正資料庫管理系統很有用，所以一些事務處理系統也支持。如果資料庫管理系統出現了整體故障，需要從最近的備份恢復。備份不會反映事備份之後提交的事務。然而，一旦資料庫管理系統被恢復，後映像的日誌就能使資料庫管理系統到最新狀態。任何進程中的事務在失敗的同時能被回滾。結果就是資料庫處於一個一致，已知的狀態包括到故障時刻提交的所有事務的結果。

### 死鎖

在一些案例中，兩個事務可能在他們處理的過程中，試圖同時接入資料庫的同一區域，某種程度上阻礙了他們的繼續進行。例如，事務 A 可能接入資料庫的區域 X，事務 B 接入資料庫的區域 Y。如果在那時，事務 A 嘗試接入資料庫的區域 Y 而事務 B 嘗試接入資料庫的區域 X，死鎖就發生了，兩個事務都不能繼續進行。事務處理系統的設計能夠在死鎖發生時檢測到這些死鎖。通常兩個事務將會被取消和回滾，然後以不同的順序自動啟動，所以死鎖不再會發生。有時，死鎖中的一個事務會被取消，回滾，然後在一小段延遲之後自動啟動。

死鎖也會在三個或多個事務之間發生。涉及越多的事務，他們就越難被偵測到。簡要的說就是事務處理系統對檢測死鎖有一個實際的限制。

### 補償事務

在提交和回滾機制不可用或不可取的系統中，通常使用補償事務來撤銷失敗的事務並將系統恢復到先前的狀態。

## ACID 標準

Jim Gray 定義了一個可靠的事務系統的屬性，首字母縮寫為 _ACID_：atomicity（原子性）,consistency（一致性）,isolation（隔離性）,durability（耐久性）。

### 原子性

一個事務對狀態的改變是基元的，所有發生的或是不發生的。這些變化包括資料庫更改，消息和傳感器上的行為。

### 一致性

一致性：事務是對狀態的正確轉換，以組為單位採取的行動不違反與狀態相關聯的完整性約束。

### 隔離性

即使事務並發執行，對於每個事務 T 來看，其他的事務都是在 T 之前或之後執行，但不是兩者都執行。

### 耐久性

一旦事務成功完成（提交），對狀態的改變從故障中倖存並被保留。

## 好處

事務處理有以下好處：

* 允許在許多用戶之間共享計算機資源。
* 將作業處理的時間轉移到計算機資源被占用少的時候。
* 避免了沒有人為互動和監督而產生空閒的計算機資源。
* 被用在昂貴的計算機類上來分攤成本，使這些昂貴的資源保持高利用率。

## 實現

標準的事務處理軟體，特別是 IBM 的信息管理系統，最早是在 20 世紀 60 年代開發的，並且經常與特定的資料庫管理系統緊密耦合。客戶端 - 服務端計算在 20 世紀 80 年代實現類似的原則，取得了成功。然而，在最近幾年中，分布式客戶端 - 服務端計算已經變得相當難以去維護。隨著相應各種線上服務（特別是 Web）的事務增長，單個分布式的資料庫已經不是一個實用的解決方案。另外，大多數包含一系列程序的線上系統一起操作，而不是單個伺服器可以處理事務的嚴格的客戶端 - 服務端模型。現在，大多數事務處理系統可用於程序級別工作和擴展到大型系統，包括大型機。
一個眾所周知的（開放）的行業標準是 X/Open 分布式事務處理（DTP）（參見 JTA，Java 事務 API）。然而，專利事務處理環境中，例如 IBM 的 CICS 還十分流行，雖然 CICS 也已經升級到包含行業標準了。
術語「極端事務處理」（XTP）已經被用來描述具有極其挑戰性要求的事務處理系統，特別是吞吐量要求（每秒鐘的事務）。這樣的系統可以通過分布式或集群式架構來實現。

## 參考

## 外部連結

* Nuts and Bolts of Transaction Processing (1999)（頁面存檔備份，存於網際網路檔案館）
* Managing Transaction Processing for SQL Database Integrity（頁面存檔備份，存於網際網路檔案館）
* Transaction Processing（頁面存檔備份，存於網際網路檔案館）

## 進一步閱覽

* Gerhard Weikum, Gottfried Vossen, _Transactional information systems: theory, algorithms, and the practice of concurrency control and recovery_, Morgan Kaufmann, 2002, ISBN 1-55860-508-8
* Jim Gray, Andreas Reuter, Transaction Processing — Concepts and Techniques, 1993, Morgan Kaufmann, ISBN 1-55860-190-2
* Philip A. Bernstein, Eric Newcomer, Principles of Transaction Processing, 1997, Morgan Kaufmann, ISBN 1-55860-415-4
* Ahmed K. Elmagarmid (Editor), Transaction Models for Advanced Database Applications, Morgan-Kaufmann, 1992, ISBN 1-55860-214-3