日期:2014-05-18  浏览次数:20821 次

Spring事务,如果A调用B(对B进行了事务配置),为什么不起作用,如果对A配置事务就起作用,


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的这个没有起到作用吗?
------解决方案--------------------
不知道是不是事务嵌套啊?如果是的话,下面仅供参考。
http://www.iteye.com/topic/35907/
------解决方案--------------------
1L是对的  自问自答啊
------解决方案--------------------
你知道配置事务的原理是什么?实际上就是一个 AOP,AOP 绝对不可能在方法中插入增强处理的!
------解决方案--------------------
而且还是一个 private 方法,private 根本不可能进行 AOP 处理,因为 AOP 的代理子类无法对 private 的方法进行增强。
------解决方案--------------------
1 # 说的有理貌似。。。
------解决方案--------------------
4楼给的那个文档应该说的很明白吧
------解决方案--------------------
<tx:method name="B" propagation="REQUIRED" />
多配置一个节点就能解决的事情。
------解决方案--------------------
A是业务操作?
------解决方案--------------------
引用:
Quote: 引用:

你知道配置事务的原理是什么?实际上就是一个 AOP,AOP 绝对不可能在方法中插入增强处理的!


那请问A是不是方法,为什么配置到A上就起作用呢,而配置到B上就不起作用。


你要弄清楚这个问题,你必须要对 AOP 有一定地了解才做得到!Spring 的 AOP 在有接口的情况下将使用 JDK 的 Proxy,有兴趣的话去看一下 java.lang.reflect.Proxy 这个类和java.lang.reflect.InvocationHandler 接口。
------解决方案--------------------
A方法处理额外的逻辑,而这些逻辑中除了调用B方法外,不需要其他事务的啊。这就说明问题了,A方法才是关键啊。
------解决方案--------------------
难道是抛出的异常没有捕获?DBException--》Exception