java事务失效原因及场景

本文探讨了Java中事务失效的几种情况,如私有方法不通过代理调用导致事务无效,以及Spring配置中的注意事项。重点介绍了使用@Transactional注解和AspectJ代理在不同场景下的行为差异。
摘要由CSDN通过智能技术生成

java事务失效原因 java事务不生效的场景

  1. 方法自调用
  2. 方法修饰符为private
  3. 方法是final的
  4. 单独的线程调用
  5. Spring中没加@Configuration注解
  6. 异常被吃掉
  7. 类没有被Spring管理
  8. 数据库没有开启事物

@Transactional
public void a(){
jdbcTemplate.execute(“insert into t1 values(1)”);
throw new RuntimeException();
}

// 自调用
public void b(){
// 由于调用者并不是代理对象,所以切面失败导致事物失效
a();
}

// 此时相当于a方法上面根本就没贴事物注解一样
@Transactional(propagation = Propagation.NEVER)
public void a(){
jdbcTemplate.execute(“insert into t1 values(1)”);
throw new RuntimeException();
}

// 调用方法也加了事物注解,此时会进行回滚,但是是由b方法的事物就行回滚的
@Transactional
public void b(){
// 由于调用者并不是代理对象,所以切面失败导致事物失效
a();
}

public class UserService {
@Autowired // 自己注入自己
private UserService userService;
@Transactional
public void a(){
jdbcTemplate.execute(“insert into t1 values(1)”);
throw new RuntimeException();
}

// 事物生效
public void b(){
    userService.a();
}

}
@EnableAspectJAutoProxy(exposeProxy = true)

public class UserService {
@Transactional
public void a(){
jdbcTemplate.execute(“insert into t1 values(1)”);
throw new RuntimeException();
}

// 事物生效
public void b(){
    // 获取当前类的代理对象
    UserService userService = (UserService) AopContext.currentProxy();
    userService.a();
}

}

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值