良葛格在 簡介交易 中已經把交易的性質說明的很清楚了,要嘛全部成功、要嘛全數陣亡;而distributed transaction(XA)是用來進行全域(global)交易,也就是把一堆交易綁(group)在一起,如同單一交易般具有 ACID 的特性。 要瞭解XA,有三篇文章必看:XA Exposed: Part I 、 PartII 與 Part III 。 簡單說明Two Phase Commit(2PC)其原則: 在XA中每一個 XAResource 代表不同的交易標的,每一組操做以一個 Xid 來表示 對每一個 XAResource 呼叫 start (),並開始作業處理(比如新增修改或刪除資料),當作業完成後再對 XAResource 呼叫 end () 若是作業出錯,必須對該作業與其前已完成的作業 XAResource ,呼叫 rollback () XA以失敗告終,中斷交易 準備階段,當所有的 XAResource 都完成 start () ~ end ()後,此階段對每一個 XAResource 叫用 prepare ()輪詢,所有輪詢結果必須是 XA_OK (準備好等待叫用 commit ())或 是XA_RDONLY (資料未改變,無需叫用 commit ()) 若是回傳結果不如預期,則對所有 XAResource 叫用 rollback () 若是這階段出現了 XAException ,coordinator(比如 TransactionManager 或是寫程式的你)則要負責收攤子( recover (復原),例如網路中斷後又連上了)或是放棄(救不回來了只好 forget ) 確認所有輪詢結果無誤後,對每一個 XAResource 呼叫 commit () 跟上階段一樣,若出現了 XAException ,coordinator也是要負責收攤子(復原或是放棄) 完成交易作業 測試程式 說明: 首先程式測試前會用 H2 database 啟動 兩個資料庫 ,並在啟動時塞入一筆叫 Rollback的資料 。 測試 代碼 中有四個 測試 ,建議一次執行一個(把其它的remark掉://@Test再執行$mvn test),由Log中看看它到底作了什...