原文連結:
http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1
在Spring中常常使用JTA以及XA協議來實現分散式交易,不過我們也有其他選項。最佳實現取決於你的應用情境,比如使用什麼類型的資源,如何在效能、安全、可靠性和資料完整性之間權衡。在這個系列文章中,來自SpringSource的David Syer將詳細講解Spring應用程式可以使用的7種分散式交易模式,其中3種使用XA,4種不使用XA。
層級: 中級
Spring架構對JTA(Java事務應用介面即Java Transaction API)的支援,使得應用程式可以在沒有運行J2EE容器的情況下使用分散式交易和XA協議。然而即便如此,XA對於管理員來說仍然是昂貴並且可能會是不可靠或者笨重的。它可能會帶來初次體驗的驚喜,但最終不少類型的應用都會避免使用它。
為了協助你理解實現分散式交易的各種方法,我將分析7種分散式交易處理模式,提供具體的示範代碼,我將按照安全性和可靠性由高到低的方式來逐個表述,從那些在最常用情況下能最大程度保證資料完整性和原子性的方法開始。當你依次往下閱讀時,注意事項和使用限制會逐漸增多。另外這些模式基本上也是按照運行成本倒敘安排(從成本最高的開始)。這些模式都是架構或者技術模式,而不是業務模式, 所以我不會關注於具體業務,而只是提供說明各個模式如何工作的簡短代碼。
注意只有開始的3個模式使用了XA,而這些由於效能原因可能並不合適或不可接受。我並不會擴充討論XA模式,因為XA已經在其他文章中被充分討論,儘管我在第一個模式中提供了簡單的示範代碼。通過閱讀這篇文章,你將學習到你能通過分散式交易做到什麼,不能做什麼以及何時如何避免使用XA - 以及什麼情況下應該用XA。
分散式交易和原子性
分散式交易(distributed transaction) 指的是包含多個事務資源的事務。事務資源指的是比如和關係型資料庫和訊息中介軟體通訊的連接器。通常這樣的資源提供一些API比如begin(), rollback(), commit(). 在Java編程中, 事務資源通常顯露為一個由底層平台提供的工廠產品:對於資料庫而言,它是一個由DataSource產生的串連,或者Java Persistence API (JPA) EntityManager;對於Java Message Service (JMS)而言,它是一個會話(Session).
典型的一個用例, JMS訊息觸發一個資料庫更新。一個成功的互動序列如下所示:
- 開始一個訊息事務
- 擷取訊息
- 開始資料庫事務
- 更新資料庫
- 提交資料庫事務
- 提交訊息事務
如果一個資料庫錯誤比如在更新時遇到約束衝突,理想的互動序列看起來如下:
by iefreer