Spring提供了TransactionProxyFactoryBean作為動态代理的生成工廠,該工廠産生目标bean的動态AOP(——面向方面程式設計)事務代理。事務代理根據所配置的事務屬性自動管理事務操作。該事務代理對事務的透明管理依賴于一個在ApplicationContext範圍全局可見的PlatformTransactionManager。
Spring提供兩個預設的事務管理器實作:DataSourceTransactionManager和JtaTransactionManager。前者隻能支援單個jdbc資料源,後者可以支援多個資料源,可以做分布式事務管理。
一般由容器提供支援JTA的事務管理器實作,Spring的JtaTransactionManager會自動通過JNDI檢測TransactionManager或UserTransaction的存在,也可以在配置中指定JNDI的設定。如果想不依賴于容器實
現分布式事務管理,可以采用開源的事務管理器實作JOTM。事務管理器必須要知道被管理的DataSource的位置,如果是DataSourceTransactionManager,在事務管理器配置中直接指定JDBC資料源的引用,如果是JtaTransactionManager,容器負責告知事務管理器需要管理的資料源。不管是哪一種情況,都需要在Dao(——資料操作對象)中配置與事務管理器相對應的資料源,即事務管理器必須要知道被管理的DataSource的位置,這也就是為什麼我們無法在Spring/JTA架構中管理Web Service事務的原因,因為Web服務是無狀态的,我們甚至不知道服務提供者背景的體系架構是什麼,那麼就更無從所知其資料源了。
最後,在應用階段,Spring的事務具有聲明式和程式設計式兩種方式。聲明式事務的用法是在配置檔案中聲明,它的實作技術主要是基于AOP的動态或靜态代理;程式設計式事務的用法是在程式中寫死實作,這可以解決一些配置無法預知的場景的情況,它是靠提供回調方法實作的。而我認為無論是AOP、代理或是回調函數,它們都是基于一種名為“增強機制”的思想去做的——将一個線性的程式過程進行切片,在這些“切片”上對程式的功能進行“增強”。
本文轉自胡奇 51CTO部落格,原文連結:http://blog.51cto.com/huqicto/280679,如需轉載請自行聯系原作者