Spring事务传播

Spring事务传播,spring,transactions,spring-transactions,Spring,Transactions,Spring Transactions,JMS/Datasource是完整的XA 2PC,由Weblogic JTA事务管理器管理 消息侦听器没有事务注释…(但似乎能够参与事务,可能是因为JMS容器的定义?) 如果ServiceB抛出任何未检查的异常,事务将回滚,消息将放回JMS队列 例外情况是在serviceA中捕获并记录的dao.update(res)正在新事务中发生,因此它将始终执行,而不管ServiceB中的结果如何 如果dao.update(res)失败,所有内容都将回滚 有人能证实上述情况吗?我的逻辑是正确的还是遗漏了什么

JMS/Datasource是完整的XA 2PC,由Weblogic JTA事务管理器管理

  • 消息侦听器没有事务注释…(但似乎能够参与事务,可能是因为JMS容器的定义?)
  • 如果ServiceB抛出任何未检查的异常,事务将回滚,消息将放回JMS队列
  • 例外情况是在serviceA中捕获并记录的dao.update(res)正在新事务中发生,因此它将始终执行,而不管ServiceB中的结果如何
  • 如果dao.update(res)失败,所有内容都将回滚
  • 有人能证实上述情况吗?我的逻辑是正确的还是遗漏了什么

    请提供意见和建议

    public class MyMessageListener
    @Autowired
    private ServiceA serviceA;
    
    //I am not declaring this as a transcational.
    public void onMessage(Message m) {  
           serviceA.methodA(m); 
    }
    
    public class ServiceA {
    
     @Autowired
    private ServiceB serviceB;
    
     @Autowired
    private DAO dao;
    
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void methodA() {
        try{
            String res = ServiceB.methodB(m);
      } catch (Exception e) {
          log.(e); 
         }
        dao.update(res);
    }
    
    
    public class ServiceB {
    
    @Autowired
    private DAO dao;
    
    @Transactional
    public void methodB(String m)  {
        dao.read()
        callExtSystem() //this can throw unchecked exception
        dao.insert()
    }
    
    public class DAO {
    
       @Transactional
       public read() {}
    
       @Transactional
       public insert(){}
    
       @Transactional(propagation=Propagation.REQUIRES_NEW)
       public update(){}
    }
    
     <bean id="jmsContainer"   class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destination" ref="destination"/>
    <property name="messageListener" ref="messageListener"/>
    <property name="transactionManager" ref="transactionManager"/> //Weblogic JTA Manager
    <property name="concurrentConsumers" value="10"/> 
    </bean>
    
    <tx:jta-transaction-manager/>
    
    公共类MyMessageListener
    @自动连线
    私人服务a服务a;
    //我并不是说这是一个跨国家的。
    消息(消息m)上的公共无效{
    服务a.方法a(m);
    }
    公共类服务{
    @自动连线
    私人服务b服务b;
    @自动连线
    私家道道;
    @事务性(传播=传播。需要\u新建)
    公开无效方法a(){
    试一试{
    字符串res=ServiceB.methodB(m);
    }捕获(例外e){
    日志(e);
    }
    更新(res);
    }
    公共类服务B{
    @自动连线
    私家道道;
    @交易的
    公共无效方法B(字符串m){
    dao.read()
    callExtSystem()//这可能引发未检查的异常
    dao.插入()
    }
    公共类DAO{
    @交易的
    公共读取(){}
    @交易的
    公共插入(){}
    @事务性(传播=传播。需要\u新建)
    公共更新(){}
    }
    //Weblogic JTA管理器
    
    你为什么不测试一下呢?嘿。我测试过了,它也能工作。但我不确定解决方案。我有点困惑,为什么我要寻找一些答案和解释