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