日期:2014-05-20  浏览次数:20717 次

关于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也一样没有事务.
------解决方案--------------------
引用:
Quote: 引用:

你的MyEntry这个类在你的Action或者哪里被调用的地方应该是注释引用是“那个Spring那时已经生成了同名的代理类”

我想问的是,为什么这个代理类对 通过A方法调用B方法的事务无效呢。


因为生成代理类的时候,对应A方法和B方法他们的事务属性也标注进去了,如果你配置的A无事务,那么你调用A方法时就没有事务,通过A再调用B也一样没事务