事务——默认配置下的事务回滚

@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();进行手动回滚,此时可以添加返回的友好信息。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值