关于SPRING事物不能再方法间起作用的疑问
public class MyEntry implements IBaseService{
/**
* 对外唯一入口
*/
public String A(String jsonStr) throws Exception{
}
//此处需要事务
private String B(UserInfo user, UserDetail detail) throws DBException{
baseDao.saveObject(user);
baseDao.saveObject(detail);
}
}
问题描述
如果我在配置事务的时候,如下
<tx:method name="A" propagation="REQUIRED" />
那么如果baseDao.saveObject(detail)异常,整个B方法全部回滚。没问题
但是
如果我在配置事务的时候仅仅对 name="B",并且不对A进行配置事务,如下:
<tx:method name="B" propagation="REQUIRED" />
那么如果baseDao.saveObject(detail)异常,方法B不能全部回滚(也就是说虽然baseDao.saveObject(detail)没有保存成功,但是baseDao.saveObject(user)保存成功了)
请问这个问题到底怎么回事呢。
根据 PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。难道SPRING的这个没有起到作用吗?
------解决方案--------------------楼主可以把方法B改成public 试一下 其他的我就不知道了
------解决方案--------------------简单的说,是在外部接口实例访问方法事务才起作用吧,例如,userservice实现类里,有save,modify方法,在modify里面直接调用save方法,save方法是不起回滚作用,save里面的表操作是不会回滚吧,你只能在modify方法里面调用userdao的insert和update才能保证两个操作的表都能回滚,至于原理你就自己看下spring的源码实现
------解决方案--------------------你的MyEntry这个类在你的Action或者哪里被调用的地方应该是注释引用的,那个Spring那时已经生成了同名的代理类,其中方法A,根据你的配置是无事务的,方法B是有事务的.然后如果你那个Action直接调用MyEntry的方法B,事务是能生效的,而调用方法A,则无事务,再根据A去调用B也一样没有事务.
------解决方案--------------------