java事务失效原因 java事务不生效的场景
- 方法自调用
- 方法修饰符为private
- 方法是final的
- 单独的线程调用
- Spring中没加@Configuration注解
- 异常被吃掉
- 类没有被Spring管理
- 数据库没有开启事物
@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();
}