一、事务失效
- 1、发生this调用; 这个 this 对象不是代理类,在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象 只有被动态代理直接调用的才会产生事务。
解决方案:XXXService proxy =(XXXService) AopContext.currentProxy(); 通过代理方式proxy对象进行调用;
- 2、方法修饰符不是 public
- 3、 发生了错误的异常 事务只会对 Error 与 RuntimeException 及其子类这些异常做出回滚, 因为默认回滚的是:RuntimeException。如果是其他异常想要回滚,需要在 @Transactional 注解上加 rollbackFor 属性。
- 4、数据库不支持事务
毕竟 Spring 事务用的是数据库的事务,如果数据库不支持事务,那 Spring 事务肯定是无法生效滴。
二、事务回滚
在Spring中进行事务回滚,
①:通过Aop切面事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
②:通过RuntimeException
throw new RuntimeException();
传播行为一:事务方法A调用非事务方法B,AB都具有事务。 出现异常数据同时回滚。
//方法A 开启事务
@Transactional
public int A(PartFamily record) {
Style style=new Style("55566",8);
partFamilyMapper.save(record);
B(style);
return 5;
}
//方法B
public int B(Style record) {
int id=styleMapper.save(record).getId();
int i=1/0;
return id;
}
传播行为二:非事务方法A调用事务方法B。出现异常都不会回滚
public int A(PartFamily record) {
Style style=new Style("55566",8);
partFamilyMapper.save(record);
B(style);
return 5;
}
@Transactional
public int B(Style record) {
int id=styleMapper.save(record).getId();
int i=1/0;
return id;
}
传播行为三:事务方法A调用事务方法B。同时具有事务,异常时同时回滚。
@Transactional
public int A(PartFamily record) {
Style style=new Style("55566",8);
partFamilyMapper.save(record);
B(style);
return 5;
}
@Transactional
public int B(Style record) {
int id=styleMapper.save(record).getId();
int i=1/0;
return id;
}