我有一个问题要问你。我有一个有2种方法的组件。第一种方法需要附加到从链中存在的另一个组件开始的外部转换(我使用Spring Integration),第二个方法必须附加(对于我的应用程序设计)到anoter事务。我想要的行为是当第二个方法抛出异常时,第一个方法启动并自己重新附加到外部事务以完成其工作。我尝试使用Spring框架的“NESTED”传播来做到这一点,但没有成功。
这是一个例子:
public ComponentClassInterface{
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor=Exception.class) /*but i have used NESTED without success and I don't want use the same transaction */
public ObjectMessage activate(ObjectMessage message);
}
public ComponentAbstractClass implements ComponentClassInterface{
public void updateObjectMessage(ObjectMessage message){
/*To obtain an attached instance of previously persisted message*/
ObjectMessage message = daoMessage.getMessageByID(message.getID);/*Here i can't retreive the message...the transaction isn't yet attached*/
message.setSomeProperty("ChangedPropertyValue");
daoMessage.updateItem(message);
}
@Override
public abstract ObjectMessage activate(ObjectMessage message);
}
public ComponentConcreteClass extends ComponentAbstractClass{
@Override
public ObjectMessage activate(ObjectMessage message){
............ doSomeStuff ............
}
}
目标是找到一个解决方案,允许我不重写/重新考虑应用程序流并保留类。
此致
达米亚诺
答案 0 :(得分:1)
通过AOP和代理支持Spring中的事务。这意味着如果类实例的方法调用同一实例的另一个方法,它不会通过Spring代理调用该方法,并且Spring无法拦截该调用并为您启动新事务。
您需要将带有REQUIRES_NEW
传播的方法放在另一个Spring组件中。