@Transactional(rollbackFor = Exception.class)
同类中方法调用
说明:现service中有ITest接口,serviceImpl中有Test类,类中有方法A、B,在A插入语句之后调用B。假设异常在插入语句之后发生。
- 1、当B添加事务时:A、B都不回滚,事务不起作用。
- 2、当A添加事务时:A、B都回滚,事务起作用。
- 结果:同类方法中事务以外层方法为准。
不同类中通过接口方法调用
说明:现service中有ITest、ITest1接口,serviceImpl中有Test、Test1类,Test类中有方法A、Test1类有方法B,在A插入语句之后调用B。假设异常在插入语句之后发生。
- 1、当B添加事务时:B发生回滚,A不起作用。
- 2、当A添加事务时:A、B都回滚,事务起作用。
- 结果:外层包含里层,谁有事务谁起作用。
注:不同/同类中AB方法都加事务则事务起作用,但没深入研究谁起作用。
注:当调取方法发现已有事物时,可以让它加入前一个已有事物。 而且,私有方法事物是不生效的,这点注意一下。
不同类中通过实例调用
待测试
@Aspect-@Around-事务问题
说明:现service中有ITest接口,serviceImpl中有Test类,类中有方法A。使用AspectTest类的环绕通知方法B进行增强。假设异常在插入语句之后发生。
- 1、当A添加事务时:A、B都回滚,事务起作用。
- 2、当B添加事务时:事务不起作用。
注:全局异常捕获失效:在catch中的最后加上 throw new RuntimeException(); 这样程序才会被AOP捕获。
注:@Order执行顺序
异常处理
- 1、直接抛出:通过添加throws Exception
- 2、通过try catch捕获:
- 可以通过throw new RuntimeException();抛给上层处理。
- 可以自己进行处理
- 可以通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚
- catch添加错误日志
- 通常在catch里直接插入数据库会随着异常发生一起回滚,此时可以另写一个类,通过@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)标注开启新事务来防止回滚
- 或者通过自定义异常来记录日志
- e.getMessage();
- e.getCause();
- 通过获取错误详细详细
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String stackTrace = sw.toString();
- 接口异常
- 通过catch捕获,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚,此时可以添加返回的友好信息。