3

使用弹簧

  1. jta-transaction-manager 可以使用 id 作为名称,以便我可以将其作为 REF 传递给我的服务层,如下所示?

  2. tx:jta-transaction-manager 只能用于 je22 容器吗?我的意思是Tomcat,我需要手动完成,如下所示:

    <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>
    

对于问题 2

    <bean id="transactionManager"
      class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="userTransaction">
            <bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
        </property>
    </bean>
4

1 回答 1

16

可以tx:jta-transaction-manager使用 id 作为名称,以便我可以将其作为 REF 传递给我的服务层,如下所示?

<tx:jta-transaction-manager>事务管理器公开为 Spring 上下文中名为“ transactionManager”的 Bean。

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

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

事务管理是否需要应用服务器?

Spring Framework 的事务管理支持极大地改变了关于 J2EE 应用程序何时需要应用程序服务器的传统观念。

特别是,您不需要应用程序服务器来通过 EJB 进行声明性事务。事实上,即使您拥有一个具有强大 JTA 功能的应用程序服务器,您也可能会认为 Spring 框架的声明性事务提供了比 EJB CMT 更强大的编程模型和更高效的编程模型。

通常,仅当您需要征用多个事务性资源时才需要应用程序服务器的 JTA 功能,并且对于许多应用程序而言,能够跨多个资源处理事务并不是必需的。例如,许多高端应用程序使用单一、高度可扩展的数据库(如 Oracle 9i RAC)。Atomikos TransactionsJOTM等独立事务管理器是其他选项。(当然您可能需要其他应用服务器功能,例如 JMS 和 JCA。)

最重要的一点是,使用 Spring 框架,您可以选择何时将您的应用程序扩展到成熟的应用程序服务器。使用 EJB CMT 或 JTA 的唯一替代方法是使用本地事务(例如 JDBC 连接上的事务)编写代码的日子已经一去不复返了,如果您需要该代码在全局、容器管理的事务中运行,那么您将面临大量的返工。使用 Spring 框架,只需更改配置,您的代码就不必更改。

So, as explained in the third paragraph, if you want to work with multiple transactional resources, you'll need global transactions which involve a JTA capable application server. And JTA capable application server means a real J2EE container or a non J2EE container (like Tomcat) with a standalone transaction manager like Atomikos, JOTM, Bitronix, SimpleJTA, JBossTS or GeronimoTM/Jencks.

FWIW, I've seen lots of complains about JOTM, I think that GeronimoTM/Jencks lacks of documentation, I can't really say anything about JBossTSArjunaTS (except that it's a rock solid product), SimpleJTA and Bitronix have both good documentation and Atomikos is an impressive product greatly documented too. Personally, I'd choose Bitronix or Atomikos.

PS: Honestly, if this sounds like Chinese to you, you should maybe consider using a single database (if this is an option, go for it!) or consider using a real J2EE container like JBoss or GlassFish as I wrote in a previous answer. No offense but all this JTA stuff is not trivial and taking the JOTM path is not that simple if you don't really understand why you need it.

于 2009-12-27T00:01:05.587 回答