1. 程式人生 > >Spring事務管理一:Spring事務管理的優點

Spring事務管理一:Spring事務管理的優點

(翻譯自spring-framework-reference.pdf 第四章 Data Access)

通常情況下,J2EE有2種事務管理方式:全域性事務和本地事務,2種事務都比較明顯的缺陷。

全域性事務:

        全域性事務允許跨多個事務資源的事務管理(通常是關係資料庫和訊息佇列),應用伺服器通過JTA(一個很複雜的api)管理全域性事務,此外,一個JTA的事務通常通過JNDI進行資源查詢,即如果你想使用JTA就必須連帶使用JNDI。JTA通常只能在應用伺服器環境下使用,顯然使用全域性事務會限制應用程式碼的重用性。

更好的方式是通過EJB CMT提供全域性事務管理,CMT是一種宣告式的事務管理。EJB CMT移除了事務相關的JNDI查詢,雖然使用EJB本身就需要使用JNDI,但這確實節省了大量的事務管理程式碼(並不是全部),重大缺陷是CMT繫結在JTA以及應用伺服器環境上,並且你必須選擇EJB來處理業務邏輯。EJB太龐大,並不是一個很吸引人的選擇(僅僅是為了增加全域性事務就使用EJB,確實....)。

本地事務:

        本地事務則和底層所使用的持久化技術有關(使用JDBC處理持久化,事務管理需要JDBC中的connection物件,使用hibernate處理持久化,事務管理需要hibernate中的session物件),比起全域性事務,本地事務更易使用,但是也有明顯的缺陷:1,不能跨事務資源,例如:使用JDBC事務來進行事務管理的程式碼在JTA全域性事務環境下就不能執行。2,使用本地事務,由於應用伺服器不需要參與事務的管理,因此不能保證跨多個事務性資源的事務正確性(不需要特別注意這種情況,大多數應用使用單個事務資源)。3,顯然事務管理和程式碼是耦合的,具有侵入性(這也是前面缺陷1的產生原因)。

Spring事務管理:

        Spring解決了全域性事務和本地事務的缺陷,允許應用開發者在任何環境下使用一致的程式設計模型。Spring同時支援程式設計式事務管理和宣告式事務管理。當使用Spring程式設計式事務管理時,開發者直接使用Spring框架的事務抽象(事務抽象這個翻譯有點拗口,原文為:transaction abstraction,不同具體事務策略的統一抽象介面,面向介面程式設計),使應用程式可以執行在任何具體的底層事務基礎之上。當使用Spring宣告式事務管理時,只需編寫少量和事務相關的程式碼即可(只需編寫一些Spring配置檔案),這些程式碼和Spring的事務api或任何其他的事務api都沒有耦合。顯然Spring的宣告式事務管理更加簡單易用。

為了使用事務管理是否應該選擇應用伺服器?

        答案是否定的。

        Spring對事務管理的支援改變了企業級JAVA應用必須要使用應用伺服器的傳統觀念。需要特別指出的是,僅僅是為了使用EJB的宣告式事務管理就選擇使用應用伺服器是完全沒有必要的(為了使用宣告式事務管理就使用EJB同樣可怕),儘管應用伺服器提供了強勁的JTA功能,Spring的宣告式事務管理比起EJB CMT更加給力,並且提供更加高效的程式設計方式。通常選擇使用應用伺服器是為了跨多個事務資源的事務管理,這種情況很少見並且許多高階應用會選擇使用高效能資料庫而不是多個事務資源。也可以選擇一些獨立的事務管理技術,但是大多數情況下這些技術都需要一些應用伺服器功能(比如JMS或是JCA)的支援。Spring更符合一次編寫,隨處執行的原則,代價僅僅是修改一些Spring配置檔案,而不是大量的重複性編碼工作。