1.@Transactional加在非public方法上,这个其实idea就能规避了,有语法检查;
2.非@Transactional注解方法调用同类中使用@Transactional注解的方法,不生效,原因是事务管理用到了动态代理,原理自己去查;
伪代码:
public void test() {
tt();
}
@Transactional
public void tt(){
myService.save(new TbInsReturnFactory(){{
setInstallSn("1");
setCreateTime(new Date());
setCreateUser("1");
setStoreCode("1");
}});
int i = 1 / 0;
}
此时外部调用test()方法,发生异常但数据仍然提交成功;
3.调用方将异常捕获,事务不回滚;
public void tt(){
this.save(new TbInsReturnFactory(){{
setInstallSn("1");
setCreateTime(new Date());
setCreateUser("1");
setStoreCode("1");
}});
int i = 1 / 0;
}
@Transactional
@GetMapping("test")
public void t() {
try {
iTbInsReturnFactoryService.tt();
} catch (Exception e) {
}
}
解决方法就是:
1)不捕获异常,通过全局捕获等方式
2)捕获后再次抛出异常
3)设置当前事务回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
4)业务层也加@Transactional注解,这时会发生异常(Transaction rolled back because it has been marked as rollback-only),这里涉及到事务传播了,不具体说