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

myepoch 2014-01-24 11:29:15


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的这个没有起到作用吗?
...全文
2249 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwneil 2016-04-27
  • 打赏
  • 举报
回复
http://blog.csdn.net/seelye/article/details/40144817 这篇文章可以解决你的问题
wwwneil 2016-04-27
  • 打赏
  • 举报
回复
引用 25 楼 a811671856 的回复:
有一种场景比较常见: 就是B方法之后,异步同步其它模块,其它模块去查B方法更新的内容,因为有的时候B的事务还没有提交,所以其它模块读取不到。 不知道大家有什么好的主意吗? 遇到这种场景是避免呢,还是可以解决?
在同一个事务里,没提交也可以查得到
千里小马 2016-02-18
  • 打赏
  • 举报
回复
有一种场景比较常见: 就是B方法之后,异步同步其它模块,其它模块去查B方法更新的内容,因为有的时候B的事务还没有提交,所以其它模块读取不到。 不知道大家有什么好的主意吗? 遇到这种场景是避免呢,还是可以解决?
千里小马 2016-02-18
  • 打赏
  • 举报
回复
研究源码、调试程序得出结论: A如果没有受事务管理: 则线程内的connection 的 autoCommit为true。 B得到事务时事务传播特性依然生效,得到的还是A使用的connection,但是 不会改变autoCommit的属性。 所以B当中是按照每条sql进行提交的。
Dawell7 2015-08-24
  • 打赏
  • 举报
回复
事务开启AspectJ即可 自己调用自己方法也可以有效
sun9763 2015-04-11
  • 打赏
  • 举报
回复
在一个方法内很明显是不可以的,因为AOP不支持这样做。 你可以把方法B放到另外一个service或者dao,然后把这个server或者dao通过@Autowired注入到方法A的bean里面,这样即使方法A没用事务,方法B也可以执行自己的事务了。AOP就是这么玩的!
ylovep 2014-01-27
  • 打赏
  • 举报
回复
难道是抛出的异常没有捕获?DBException--》Exception
  • 打赏
  • 举报
回复
<tx:method name="B" propagation="REQUIRED" /> 多配置一个节点就能解决的事情。
myepoch 2014-01-26
  • 打赏
  • 举报
回复
引用 12 楼 coolbamboo2008 的回复:
4楼给的那个文档应该说的很明白吧
这篇文章说的是关“PROPAGATION_NESTED”,并且文章中也提到服务间如何嵌套事务。 和我咨询的还是有些差别。 我咨询的是: Spring事务,如果A调用B(对B进行了事务配置,A不进行事务配置),为什么不起作用, 但是如果对A配置事务就起作用,哪怕B不配置
coolbamboo2008 2014-01-26
  • 打赏
  • 举报
回复
4楼给的那个文档应该说的很明白吧
jiekou0704 2014-01-26
  • 打赏
  • 举报
回复
1 # 说的有理貌似。。。
myepoch 2014-01-26
  • 打赏
  • 举报
回复
还有人能帮忙吗
  • 打赏
  • 举报
回复
A方法处理额外的逻辑,而这些逻辑中除了调用B方法外,不需要其他事务的啊。这就说明问题了,A方法才是关键啊。
myepoch 2014-01-26
  • 打赏
  • 举报
回复
希望大家提供帮助啊。
myepoch 2014-01-26
  • 打赏
  • 举报
回复
你好, 我的意思是在A方法中调用B方法 方法A没有事务,我没有配置事务节点,而方法B有事务,我配置了方法B的节点,结果事务不起作用 除非我将A配置事务(B即便不配置事务)也起作用。 所以我想咨询的是 "是不是Spring 内部调用时,被调用方法的事务声明将不起作用",为什么呢?难道一定要在A方法上加事务码,A方法处理额外的逻辑,而这些逻辑中除了调用B方法外,不需要其他事务的啊。
  • 打赏
  • 举报
回复
引用 9 楼 myepoch 的回复:
[quote=引用 6 楼 bao110908 的回复:] 你知道配置事务的原理是什么?实际上就是一个 AOP,AOP 绝对不可能在方法中插入增强处理的!
那请问A是不是方法,为什么配置到A上就起作用呢,而配置到B上就不起作用。[/quote] 你要弄清楚这个问题,你必须要对 AOP 有一定地了解才做得到!Spring 的 AOP 在有接口的情况下将使用 JDK 的 Proxy,有兴趣的话去看一下 java.lang.reflect.Proxy 这个类和java.lang.reflect.InvocationHandler 接口。
  • 打赏
  • 举报
回复
A是业务操作?
myepoch 2014-01-26
  • 打赏
  • 举报
回复
引用 14 楼 fangmingshijie 的回复:
<tx:method name="B" propagation="REQUIRED" /> 多配置一个节点就能解决的事情。
你好,方法A没有事务,我没有配置事务节点,而方法B有事务,我只配置了方法B的节点,结果不好用。除非我将A配置事务(B即便不配置事务)也对
myepoch 2014-01-24
  • 打赏
  • 举报
回复
有人说 内部调用时,被调用方法的事务声明将不起作用 Spring的事务传播策略在内部方法调用时将不起作用
myepoch 2014-01-24
  • 打赏
  • 举报
回复
引用 6 楼 bao110908 的回复:
你知道配置事务的原理是什么?实际上就是一个 AOP,AOP 绝对不可能在方法中插入增强处理的!
那请问A是不是方法,为什么配置到A上就起作用呢,而配置到B上就不起作用。
加载更多回复(7)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧