1.抛出检查异常
2.业务方法内try-catch
3.切面顺序
4.非public方法,被final和static修饰的方法
5.父子容器
6.使用this调用本类方法
7.多线程下原子性失效
8.Transaction导致加锁失败
9.多线程调用
10.使用了不支持事务的存储引擎
11.错误的传播行为
1.抛出检查异常
产生原因:
我们在使用@Transactional注解的时候,如果不加rollbackFor的类型
@Transactional
它默认抛出的是RuntimeException。
我们可以看一下异常的类图:
也就是说,默认情况下,IOException,SQLException等异常,不会造成事务的回滚。
解决方案:
@Transactional(rollbackFor = Exception.class)
指定回滚的类型为Exception.class
2.业务方法内try-catch
产生原因:
业务逻辑代码内try-catch异常,直接消化异常,导致spring无法捕捉到异常。
@Transactional(rollbackFor = Exception.class) public void transfer(int fromAccount, int toAccount, int money) { //模拟一个转账操作 try { int fromBalance = userAccountMapper.findBalanceByUserAccount(fromAccount); if (fromBalance - money >= 0) { //减钱 userAccountMapper.update(fromAccount, -1 * money); //增钱 userAccountMapper.update(toAccount, money); } } catch (Exception e) { e.printStackTrace(); } }
解决方案:
1.我们应该抛出异常,