关于SPRING事物不能再方法间起作用的疑问

myepoch 2014-01-24 11:26:39
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的这个没有起到作用吗?
...全文
472 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
antony0203 2014-01-27
  • 打赏
  • 举报
回复
引用 12 楼 myepoch 的回复:
[quote=引用 10 楼 antony0203 的回复:] 你的MyEntry这个类在你的Action或者哪里被调用的地方应该是注释引用的,那个Spring那时已经生成了同名的代理类,其中方法A,根据你的配置是无事务的,方法B是有事务的.然后如果你那个Action直接调用MyEntry的方法B,事务是能生效的,而调用方法A,则无事务,再根据A去调用B也一样没有事务.
您的回复是“那个Spring那时已经生成了同名的代理类” 我想问的是,为什么这个代理类对 通过A方法调用B方法的事务无效呢。[/quote] 因为生成代理类的时候,对应A方法和B方法他们的事务属性也标注进去了,如果你配置的A无事务,那么你调用A方法时就没有事务,通过A再调用B也一样没事务
myepoch 2014-01-26
  • 打赏
  • 举报
回复
还有人能提供支援吗
myepoch 2014-01-26
  • 打赏
  • 举报
回复
到底什么原因呢
小丑哥_V5 2014-01-26
  • 打赏
  • 举报
回复
简单的说,是在外部接口实例访问方法事务才起作用吧,例如,userservice实现类里,有save,modify方法,在modify里面直接调用save方法,save方法是不起回滚作用,save里面的表操作是不会回滚吧,你只能在modify方法里面调用userdao的insert和update才能保证两个操作的表都能回滚,至于原理你就自己看下spring的源码实现
myepoch 2014-01-26
  • 打赏
  • 举报
回复
有人能帮助吗
myepoch 2014-01-26
  • 打赏
  • 举报
回复
引用 10 楼 antony0203 的回复:
你的MyEntry这个类在你的Action或者哪里被调用的地方应该是注释引用的,那个Spring那时已经生成了同名的代理类,其中方法A,根据你的配置是无事务的,方法B是有事务的.然后如果你那个Action直接调用MyEntry的方法B,事务是能生效的,而调用方法A,则无事务,再根据A去调用B也一样没有事务.
您的回复是“那个Spring那时已经生成了同名的代理类” 我想问的是,为什么这个代理类对 通过A方法调用B方法的事务无效呢。
myepoch 2014-01-26
  • 打赏
  • 举报
回复
所以我想咨询的是 "是不是Spring 内部调用时,被调用方法的事务声明将不起作用",为什么呢?难道一定要在A方法上加事务码,A方法处理额外的逻辑,而这些逻辑中除了调用B方法外,不需要其他事务的啊。
antony0203 2014-01-26
  • 打赏
  • 举报
回复
你的MyEntry这个类在你的Action或者哪里被调用的地方应该是注释引用的,那个Spring那时已经生成了同名的代理类,其中方法A,根据你的配置是无事务的,方法B是有事务的.然后如果你那个Action直接调用MyEntry的方法B,事务是能生效的,而调用方法A,则无事务,再根据A去调用B也一样没有事务.
myepoch 2014-01-24
  • 打赏
  • 举报
回复
这个问题困扰很久了,就是不清楚回事啊。是不是我哪里配置的不对呢。
myepoch 2014-01-24
  • 打赏
  • 举报
回复
有人说 内部调用时,被调用方法的事务声明将不起作用 Spring的事务传播策略在内部方法调用时将不起作用
myepoch 2014-01-24
  • 打赏
  • 举报
回复
郁闷啊,没人能解答吗
myepoch 2014-01-24
  • 打赏
  • 举报
回复
更改public,问题依旧
Test_LD 2014-01-24
  • 打赏
  • 举报
回复
楼主可以把方法B改成public 试一下 其他的我就不知道了
myepoch 2014-01-24
  • 打赏
  • 举报
回复
请各位高手帮忙

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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