spring事务,内部调用生效

1、示例类:
public interface AService{
void a();
void b();
}


@Service
public class AServiceImpl implements AService{

@Transactional(propagation=Propagation.REQUIRED)
public void a(){
this.b();
}


@Transactional(propagation=Propagation.REQUIRES_NEW)
public void b(){

}
}


2、此处的this指向目标对象,因此调用this.b()将不会执行b事务切面,即不会执行事务增强。因此b方法的事务定义
“@Transactional(propagation=Propagation.REQUIRES_NEW)”将不会实施。为了解决这个问题,可以这样做:
<aop:aspectj-autoproxy expose-proxy="true" />
我们将以上代码中的"this.b();",修改为“((AService)AopContext.currentProxy()).b();”即可。
通过以上的修改便可以完成对a和b方法的同时增强。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring中,事务回滚不生效的情况可能有多种原因。以下是一些常见的情况: 1. 未正确配置事务管理器:确保在Spring配置文件中正确地配置了事务管理器。例如,使用`<tx:annotation-driven>`标签启用注解驱动的事务管理。 2. 方法未标记为事务:确保需要事务支持的方法上使用了`@Transactional`注解。如果方法未被正确地标记为事务事务将不会生效。 3. 异常未被正确抛出:在默认情况下,只有抛出`RuntimeException`及其子类的异常才会触发事务回滚。如果你的代码中抛出了其他类型的异常(如Checked Exception),事务将不会回滚。你可以使用`rollbackFor`属性来指定需要回滚的异常类型。 4. 异常被捕获并处理:如果在方法内捕获并处理了异常,并且没有将其重新抛出,事务将不会回滚。如果你希望事务回滚,确保在适当的时候重新抛出异常。 5. 事务传播行为设置不正确:如果在多个方法调用中存在事务,并且它们的传播行为设置不正确,可能会导致事务回滚不生效。确保使用适当的传播行为设置来满足你的业务需求。 6. 未启用事务自动提交:如果未启用事务自动提交(默认情况下是禁用的),事务将不会生效。你可以在Spring配置文件中将`defaultAutoCommit`属性设置为`true`来启用事务自动提交。 如果你仍然遇到事务回滚不生效的问题,建议检查日志以查看是否有与事务相关的错误或警告信息,并确保你的代码逻辑正确地应用了事务管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值