spring 事务管理器可以管理 2 个 pc 事务吗?

can spring transaction manager able to manage 2 pc transaction?

我在我的应用程序 jms数据库 中使用了 2 个资源。我已经像下面这样配置了,我正在按照下面的顺序做一个简单的测试来检查系统是否中断。

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

这是完整的工作代码: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>

这是 spring 中的独立应用程序,已尝试使用 ChainedTrnsactionManager,但它会使系统变慢

您的配置看起来不支持两阶段提交事务。当使用 Spring 作为 2PC 的事务管理器时,您需要使用 JtaTransactionManager which would internally use the actual JTA transaction manager provided typically by JTA containers ( all EE compliant servers) or using standalone transaction managers such as Bitrionix or Atomikos. For a sample example take a look here.