?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
傳統(tǒng)上,J2EE開(kāi)發(fā)者有兩個(gè)事務(wù)管理的選擇: 全局 或 本地 事務(wù)。全局事務(wù)由應(yīng)用服務(wù)器管理,使用JTA。局部事務(wù)是和資源相關(guān)的,比如一個(gè)和JDBC連接關(guān)聯(lián)的事務(wù)。這個(gè)選擇有深刻的含義。例如,全局事務(wù)可以用于多個(gè)事務(wù)性的資源(典型例子是關(guān)系數(shù)據(jù)庫(kù)和消息隊(duì)列)。使用局部事務(wù),應(yīng)用服務(wù)器不需要參與事務(wù)管理,并且不能幫助確保跨越多個(gè)資源(需要指出的是多數(shù)應(yīng)用使用單一事務(wù)性的資源)的事務(wù)的正確性。
全局事務(wù).?
全局事務(wù)有一個(gè)重大的缺陷,代碼需要使用JTA:一個(gè)笨重的API(部分是因?yàn)樗漠惓DP停?。此外,JTA的UserTransaction
通常需要從JNDI獲得,這意味著我們?yōu)榱薐TA,需要 同時(shí) 使用JNDI 和 JTA。顯然全部使用全局事務(wù)限制了應(yīng)用代碼的重用性,因?yàn)镴TA通常只在應(yīng)用服務(wù)器的環(huán)境中才能使用。
以前,使用全局事務(wù)的首選方式是通過(guò)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實(shí)現(xiàn)業(yè)務(wù)邏輯,或者至少處于一個(gè)事務(wù)化EJB的外觀(Facade)后才能使用它。EJB有如此多的詬病,尤其是存在其它聲明式事務(wù)管理時(shí),EJB不是一個(gè)吸引人的建議。
本地事務(wù).?本地事務(wù)容易使用,但也有明顯的缺點(diǎn):它們不能用于多個(gè)事務(wù)性資源。例如,使用JDBC連接事務(wù)管理的代碼不能用于全局的JTA事務(wù)中。另一個(gè)缺點(diǎn)是局部事務(wù)趨向于入侵式的編程模型。
Spring解決了這些問(wèn)題。它使應(yīng)用開(kāi)發(fā)者能夠使用在 任何環(huán)境 下使用 一致 的編程模型。你可以只寫(xiě)一次你的代碼,這在不同環(huán)境下的不同事務(wù)管理策略中很有益處。Spring框架同時(shí)提供聲明式和編程式事務(wù)管理。聲明事務(wù)管理是多數(shù)使用者的首選,在多數(shù)情況下是被推薦使用的。
使用編程式事務(wù)管理,開(kāi)發(fā)者直接使用Spring框架事務(wù)抽象,這個(gè)抽象可以使用在任何底層事務(wù)基礎(chǔ)之上。使用首選的聲明式模型,開(kāi)發(fā)者通常書(shū)寫(xiě)很少的或沒(méi)有與事務(wù)相關(guān)的代碼,因此不依賴(lài)Spring框架或任何其他事務(wù)API。