?
This document uses PHP Chinese website manual Release
傳統(tǒng)上,J2EE開發(fā)者有兩個事務(wù)管理的選擇: 全局 或 本地 事務(wù)。全局事務(wù)由應(yīng)用服務(wù)器管理,使用JTA。局部事務(wù)是和資源相關(guān)的,比如一個和JDBC連接關(guān)聯(lián)的事務(wù)。這個選擇有深刻的含義。例如,全局事務(wù)可以用于多個事務(wù)性的資源(典型例子是關(guān)系數(shù)據(jù)庫和消息隊列)。使用局部事務(wù),應(yīng)用服務(wù)器不需要參與事務(wù)管理,并且不能幫助確??缭蕉鄠€資源(需要指出的是多數(shù)應(yīng)用使用單一事務(wù)性的資源)的事務(wù)的正確性。
全局事務(wù).?
全局事務(wù)有一個重大的缺陷,代碼需要使用JTA:一個笨重的API(部分是因為它的異常模型)。此外,JTA的UserTransaction
通常需要從JNDI獲得,這意味著我們?yōu)榱薐TA,需要 同時 使用JNDI 和 JTA。顯然全部使用全局事務(wù)限制了應(yīng)用代碼的重用性,因為JTA通常只在應(yīng)用服務(wù)器的環(huán)境中才能使用。
以前,使用全局事務(wù)的首選方式是通過EJB的 CMT(容器管理事務(wù)):CMT是 聲明式事務(wù)管理 的一種形式(區(qū)別于 編程式事務(wù)管理)。EJB的CMT不需要任何和事務(wù)相關(guān)的JNDI查找,雖然使用EJB本身肯定需要使用JNDI。它消除了大多數(shù)(不是全部)硬編碼的方式去控制事務(wù)。重大的缺陷是CMT綁定在JTA和應(yīng)用服務(wù)器環(huán)境上,并且只有我們選擇使用EJB實現(xiàn)業(yè)務(wù)邏輯,或者至少處于一個事務(wù)化EJB的外觀(Facade)后才能使用它。EJB有如此多的詬病,尤其是存在其它聲明式事務(wù)管理時,EJB不是一個吸引人的建議。
本地事務(wù).?本地事務(wù)容易使用,但也有明顯的缺點:它們不能用于多個事務(wù)性資源。例如,使用JDBC連接事務(wù)管理的代碼不能用于全局的JTA事務(wù)中。另一個缺點是局部事務(wù)趨向于入侵式的編程模型。
Spring解決了這些問題。它使應(yīng)用開發(fā)者能夠使用在 任何環(huán)境 下使用 一致 的編程模型。你可以只寫一次你的代碼,這在不同環(huán)境下的不同事務(wù)管理策略中很有益處。Spring框架同時提供聲明式和編程式事務(wù)管理。聲明事務(wù)管理是多數(shù)使用者的首選,在多數(shù)情況下是被推薦使用的。
使用編程式事務(wù)管理,開發(fā)者直接使用Spring框架事務(wù)抽象,這個抽象可以使用在任何底層事務(wù)基礎(chǔ)之上。使用首選的聲明式模型,開發(fā)者通常書寫很少的或沒有與事務(wù)相關(guān)的代碼,因此不依賴Spring框架或任何其他事務(wù)API。