對於事務管理,J2EE開發者有兩種選擇:全局事務和局部事務。
1、全局事務
全局事務由應用服務器通過JTA進行管理。以前,使用全局事務比較流行的方法是採用EJB CMT,CMT是聲明式事務管理的一種形式(區別於編程式事務管理)。儘管使用EJB本身就需要使用JNDI ,EJB CMT不需要事務相關的JNDI lookups。EJB CMT不需要編寫大量的Java代碼來控制事務。使用CMT最大的不足之處是它被束縛在JTA和應用服務器上。CMT只有當在EJB中實現業務邏輯時纔可以發揮作用,或者至少處於事務性EJB Façade中。由於EJB存在諸多的不足並且目前存在其他可選的聲明式事務管理的解決方案,所以不太建議使用EJB方式。
1.1、全局事務的優點:
(1)全局事務支持多個事務性資源間的相互工作(如:關係型數據庫和消息隊列)。
1.2、全局事務的缺點:
(1)採用全局事務需要使用JTA,而JTA是一個笨重的API。
(2)通常情況下,JTA UserTransaction需要從JNDI獲取。這意味着,如果我們使用JTA,就需要同時使用JTA和JNDI。
(3)通常JTA只能在應用服務器環境下使用,因此使用JTA會限制代碼的複用性。
2、局部事務
局部事務是資源特有的(resource-specific),最常見的例子是與JDBC連接相關聯的事務。使用局部事務,應用服務器不參與事務管理並且不能保證訪問多個資源的正確性。值得注意的是:大多數應用程序使用單個的事務性資源。
2.1、局部事務的優點:
(1)易用
2.2、局部事務的缺點:
(1)局部事務不支持多個事務性資源間的相互工作,比如:使用JDBC連接來管理事務的代碼不能在全局JTA事務上運行。
(2)局部事務趨向於編程模型,編程模型具有侵入性。
Spring可以使應用程序開發者在任何環境下使用統一的編程模型。應用程序開發者只需要編寫一次代碼,就可以使用不同環境下的不同事務管理策略。Spring既支持聲明式事務管理,也支持編程式事務管理。
我們推薦使用聲明式事務管理。採用編程式事務管理,開發者需要使用Spring提供的事務抽象(它可以在任何基礎的事務架構上運行)。採用聲明式事務管理,開發者僅需要編寫少量甚至不需要編寫與事務管理相關的代碼,因此它不依賴於Spring的事務API。
3、術語
全局事務:Global Transactions
局部事務:Local Transactions
JTA:Java Transaction API
CMT:Container Managed Transaction
聲明式事務管理:Declarative Transaction Management
編程式事務管理:Programmatic Transaction Management