spring事物传播

SSI,事物是由spring AOP声明式管理的,定义在service层;
下面是我的事物属性:
[code="java"]



[/code]
在service层方法中有两个操作A,B。
B是service的另外一个方法,我自己在B方法中抛了个RuntimeException;
REQUIRES_NEW是会重新声明一个事物,所以A,B是两个不同的事物。
我现在的问题是B抛出异常后,按理说只有rollback才对啊,但是现在的情况是A,B都rollback!!

5个回答

PROPAGATION_REQUIRES_NEW:二个事务没有信赖关系,不会存在A事务的成功取决于B事务的情况。有可能存在A提交B失败。A失败(比如执行到doSomeThingB的时候抛出异常)B提交,AB都提交,AB都失败的可能

PROPAGATION_REQUIRES_NEW的使用条件:JtaTransactionManager作为事务管理器

henghanan
henghanan 我把调用del方法移到action来就可以了 <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> public String addUser() { userService.addUser(user); userService.deleteUserById(11); return "addUserSuccess"; } 因为这样的话,service里的addUser执行完事务也就结束了,再调用deleteUserById是另起一个事务
7 年多之前 回复
sweat89
sweat89 代码贴在上面了。。。。麻烦看下
7 年多之前 回复
henghanan
henghanan 你的业务逻辑是怎样的?
7 年多之前 回复
sweat89
sweat89 还是不行,我把A设置成REQUIRED,B设置成NESTED,还是两个都rollback
7 年多之前 回复
henghanan
henghanan 用PROPAGATION_NESTED
7 年多之前 回复
sweat89
sweat89 如果要达到我那种效果,A提交,B回滚,事物属性应该怎样配置呢 ?
7 年多之前 回复

又是你吧?你service操作A/B的方法的事务传播行为是什么?如果默认的话,是required,是都会被回滚的,设置成这个试试PROPAGATION_SUPPORTS

sweat89
sweat89 都设置成supports,结果是两个都没有rollback
7 年多之前 回复
gaoyong3013
yonge 貌似你在群里面问了这个问题啊,你把调用A、B方法的方法的事务传播行为设置成PROPAGATION_SUPPORTS试试
7 年多之前 回复
sweat89
sweat89 B用的是REQUIRES_NEW啊,调用B的时候,应该会重新声明一个事物把。PS:怎么又是我- -
7 年多之前 回复

你的addUser方法里调用了deleteUser方法,事务肯定是同一个。同一个方法有不同的事务怎么做到事务的一致?矛盾的呀。。。

sweat89
sweat89 deleteUser注释掉,在add抛异常的话,会回滚的
7 年多之前 回复
iswift
iswift 你把调用deleteUser的方法先注释掉,测试下是否还是同时回滚。如果不是那就是这个原因啊..
7 年多之前 回复
sweat89
sweat89 <tx:method name="deleteUser" propagation="REQUIRES_NEW"/>,我是这样配置的啊,会重新创建一个事物吧
7 年多之前 回复

不管设置都会回滚的
试一试
public void addUser(User user) {
userDaoImpl.addUser(user);
try {
this.deleteUser(1);
} catch(Excp e) {
// XXXOO
}
}

Spring的事务是通过[b]AOP[/b]来实现的,OK?
如果是动态代理的话,你在service内部 A调用B,是没有经过AOP的,怎么会有REQUIRES_NEW呢。

你可以尝试A和B在不同的类,再试试。

sweat89
sweat89 哥们啊,我现在是把方法B写到serviceB里,然后再之前的service调用了B里面的方法B,按理说这样方法B会被AOP拦截,再生成新的事物对吧,奇怪的是,现在B回滚的话,A还是会回滚,真的有点迷糊了
7 年多之前 回复
weixin_42628032
victor-张 ok, 所以你试了在不同的类是不是这样,或者你确认cglib的代理一定会是调用this .B 不是super.B
7 年多之前 回复
sweat89
sweat89 cglib代理的。<aop:config proxy-target-class="true">
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问