春季JTA事务管理器

3

使用 Spring

  1. can jta-transaction-manager use id as name so that I can pass it as REF to my service layer like below?

  2. is tx:jta-transaction-manager can only be used for je22 container? I mean for Tomcat, I need to do it manually, like below:

    <tx:jta-transaction-manager id="name_transactionmanager"/>
    
        <bean id="projectService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager"
                      ref="name_transactionmanager"/>
            <property name="target">
                <bean
                  class="com.company.project.company.services.ServiceImpl"
                  init-method="init">
                     <property
                       name="HRappsdao"
                       ref="HRappsdao"/>
                     <property
                       name="projectdao"
                       ref="projectdao"/>
                </bean>
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="store*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="remove*">PROPAGATION_REQUIRED</prop>
                    <prop key="bulkUpdate*">PROPAGATION_REQUIRED</prop>
                    <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
                </props>
            </property>
        </bean>
    

For question 2

    <bean id="transactionManager"
      class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="userTransaction">
            <bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
        </property>
    </bean>
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
16

请问tx:jta-transaction-manager能否使用id作为名称,以便我可以像下面这样将其作为REF传递给我的服务层?

<tx:jta-transaction-manager>在Spring上下文中以名称"transactionManager"的形式公开事务管理器。

tx:jta-transaction-manager只能与J2EE容器一起使用吗?

引用Spring文档中的第9章 事务管理

需要应用服务器来进行事务管理吗? Spring框架的事务管理支持显著改变了传统的J2EE应用程序需要应用服务器的想法。 特别是,您不需要应用服务器仅通过EJB具有声明性事务。实际上,即使您拥有具有强大JTA功能的应用服务器,您可能会决定Spring框架的声明性事务提供更多的功能和比EJB CMT更高效的编程模型。 通常,只有在需要注册多个事务资源时才需要应用服务器的JTA功能,并且对于许多应用程序,能够跨多个资源处理事务并不是必需的。例如,许多高端应用程序使用单个高度可伸缩的数据库(例如Oracle 9i RAC)。 Atomikos TransactionsJOTM等独立事务管理器是其他选择。(当然,您可能需要其他应用服务器功能,例如JMS和JCA。) 最重要的是,使用Spring框架,您可以选择何时将应用程序升级为完整的应用服务器。过去的日子里,除了使用本地事务(例如JDBC连接上的事务)编写代码并面对沉重的重构之外,使用EJB CMT或JTA的唯一选择就是。使用Spring框架,只有配置需要更改,以便您的代码不必更改。

因此,如第三段所解释的那样,如果您想使用多个事务资源进行工作,则需要全局事务,这涉及到一个具有JTA能力的应用服务器。而“JTA能力的应用服务器”指的是真正的J2EE容器或非J2EE容器(如Tomcat),并配备像AtomikosJOTMBitronixSimpleJTAJBossTSGeronimoTM/Jencks这样的独立事务管理器。

顺便说一句,我看到很多人对JOTM抱怨不少,我认为GeronimoTM/Jencks缺乏文档,我对JBossTSArjunaTS没有什么实质性的评价(除了它是一个非常稳定的产品),SimpleJTA和Bitronix都有良好的文档,而Atomikos是一个令人印象深刻的产品,文档也非常全面。就我个人而言,我会选择Bitronix或Atomikos。

提示:老实说,如果这对你来说听起来像中文,你可能应该考虑使用单个数据库(如果有这个选项,就选择它!)或者考虑使用我在以前的答案中提到的真正的J2EE容器,比如JBoss或GlassFish。不冒犯,但所有这些JTA的东西都不是简单的,如果你不真正理解为什么需要它,那么走JOTM的路线也不是那么简单。


1
你的答案非常棒,我来到这个帖子是为了寻找一种在容器外但具有活动数据库的方式对我的 DAOs(它们本身是 EJB 并使用其他 EJB,以及需要事务上下文)进行单元测试。我能够在 POJO 中模拟大多数其他 EJB 逻辑,但由于缺乏事务上下文,一些其他代码在运行测试时会失败。我不能使用 Spring,我想它至少需要一个 Web 服务器。使用独立的事务管理器似乎对于单元测试来说有些过度设计,您认为呢? - Dchucks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,