【发布时间】:2017-02-14 01:03:51
【问题描述】:
我在 Spring 中的事务有这种奇怪的行为。
我有两个班级:
首先由 doGenericServiceStuff 调用的服务类(由另一个已经拥有事务的对象):
@Service("myService")
public class ServiceClass {
public void doGenericServiceStuff(Object someBean){
BusinessI business = BusinessFactory.getBusinessForObject(someBean); //Here, returns the commonBusinessClass bean
business.doGenericBusinessStuff(someBean);
}
/*@Transactional (readOnly=false, rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)*/
public void firstOperation(Object o){
//multiple database insert and stuff
}
/*@Transactional (readOnly=false, rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)*/
public void secondOperation(Object o){
//also multiple database insert and stuff
}
}
然后是调用ServiceClass的一些方法的CommonBusinessClass:
@Bean("commonBusinessClass")
public class CommonBusinessClass implements BusinessI{
@Autowired
@Qualifier("myService")
protected ServiceClass = null;
@Transactional(rollBackFor=Exception.class, Propagation=Propagation.MANDATORY)
public Object doGenericBusinessStuff(Object o){
service.firstOperation(o);
service.secondOpertion(o);
//There can be stuff here in other BusinessClass
return o;
}
}
免责声明:显然,我不会像那样操纵Objects,也不会调用我的方法doGenericStuff()。但是,ServiceClass 确实调用了 CommonBusinessClass,而后者又调用了 ServiceClass。也许这是糟糕的设计,也许是它不起作用的原因,但这就是我目前所拥有的。
ServiceClass 中的方法不是事务性的(因此是 cmets),而 doGenericBusinessStuff() 是(带有Propagation.MANDATORY)。
新的要求是如果secondOperation() 失败(和回滚)firstOperation() 应该被提交。所以我为firstOperation()和secondOperation()添加了@Transactional(评论中的那些)。我期待它能够正常工作(secondOperation() 中的异常不会回滚firstOperation() 中所做的事情),但事实并非如此。但是,如果我删除 doGenericBusinessStuff() 上的 @Transactional,它会起作用。
这种行为是否正常,或者在我的实际应用程序中还有其他一些我没有放在这里的东西(因为我简化了它)?为什么新创建的交易会以任何方式相互关联?对可能发生的事情有任何想法吗?
提前致谢。
【问题讨论】:
标签: java spring transactions jta