【问题标题】:can spring transaction manager able to manage 2 pc transaction?spring 事务管理器可以管理 2 pc 事务吗?
【发布时间】:2015-10-18 19:18:56
【问题描述】:

我在我的应用程序 jmsdatabase 中使用了 2 个资源。我已经像下面这样配置了,我正在下面做一个简单的测试,以检查系统的中断。

  1. 在 DB 中插入 uuid。
  2. 将 uuid 作为消息发送到 jms 队列。
  3. 在远程监听器上监听消息。
  4. 检查 uuid 是否存在于 DB 中?

这是完整的工作代码:https://github.com/ameyjadiye/mq-fury

这样我只是想确保当远程侦听器在数据库中检查数据时,数据始终存在于数据库中。

我正在系统上运行 1k 条消息,到目前为止一切正常,是否有可能检查失败?我没有明确管理数据库事务,我需要在这里做更多设置吗?

<bean id = "messageListenerContainer2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destinationName" value="real_queue"/>
    <property name="messageListener" ref="jmsMessageListener2"/>
    <property name="cacheLevel" value="1"/>
    <property name="concurrency" value="5-5" />
    <property name="sessionTransacted" value="true"/>
    <property name="transactionManager" ref="jmsTransactionManager"/>
  </bean>

  <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="connectionFactory" />
  </bean>
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="dataSource"/>
      </bean>

     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://192.168.0.102:3306/test" />
            <property name="username" value="root" />
            <property name="password" value="r00T" />
        </bean>

这是春季的一个独立应用程序,使用 ChainedTrnsactionManager 进行了尝试,但它使系统变慢

【问题讨论】:

  • 需要配置JTATransactionManager才能使用2PC。也许这就是缺少的东西?
  • 问题是否需要有关我所做的配置的更多信息?

标签: java spring transactions spring-transactions spring-jms


【解决方案1】:

您的配置似乎不支持两阶段提交事务。当使用 Spring 作为 2PC 的事务管理器时,您将需要使用 JtaTransactionManager,这将在内部使用通常由 JTA 容器(所有符合 EE 的服务器)提供的实际 JTA 事务管理器或使用独立的事务管理器,例如 Bitrionix 或 @987654323 @。有关示例,请查看 here

【讨论】:

  • 它的简单spring应用,没有部署在任何EE服务器上,还有JTAtransactionManager和chainedTransactionManager有什么不同?
  • @Arney Jadiye:来自文档:PlatformTransactionManager 实现,它协调事务创建、提交和回滚到委托列表。 使用此实现假定导致事务回滚的错误通常发生在事务完成之前或最内部的 PlatformTransactionManager 提交期间。 在 JTA 事务管理器/2PC 中,错误可能发生在任何地方,整个事务将被还原。不想听起来傲慢,但请阅读文档。
  • @Amey - 对于 2PC,Spring 没有实际的全局事务(也称为 XA 事务)能力。这种能力已经被外部 JTA 事务管理器完善了,Spring 不打算重新发明轮子。如果您的应用程序未在 EE 服务器上运行,则需要使用外部 TM。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2013-06-30
  • 2017-05-29
  • 2012-10-16
相关资源
最近更新 更多