Spring事务传播
JMS/Datasource是完整的XA 2PC,由Weblogic JTA事务管理器管理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)失败,所有内容都将回滚 有人能证实上述情况吗?我的逻辑是正确的还是遗漏了什么
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管理器
你为什么不测试一下呢?嘿。我测试过了,它也能工作。但我不确定解决方案。我有点困惑,为什么我要寻找一些答案和解释