spring事务什么时候失效?什么时候不会进行回滚?
1、访问权限问题
非public权限
2、方法用final修饰
spring事务基于AOP,方法被final修饰后不能被重写
3、方法内部使用
public void add(Dto dto){ insert(dto); update(dto);}@Transtional()public void update(){}
update相当于this调用,不会被重写
4、未被spring管理
5、多线程调用
spring的事务是在一个连接中,而连接是存在ThreadLocal中,多线程的会就会出现问题
6、表不支持事务
如Myasim
7、错误的传播特性
8、自己吞了异常
在catch中不抛出异常
try{ .....}catch(Exception e){ log.error(e.getMessage());}
9、手动抛了别的异常
spring默认情况下只会对RuntimeException和Error进行回滚,不会对普通的Exception进行回滚
10、自定义回滚异常
@Transactional(rollbackFor = BusinessException.class)public void add(Dto dto){ inser(dto);}
当发生BusinessException进行回滚,但是当发生其他异常如SqlException就不会进行回滚