日常Bug排查-抛异常不回滚

开发 前端
最近有人反映java应用操作数据库的时候,抛异常不回滚。这还了得,不过笔者笃定肯定是用法的锅,不然就全乱套了。所以笔者去Review他的代码。

[[404090]]

 前言

日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材^_^。

Bug现场

最近有人反映java应用操作数据库的时候,抛异常不回滚。这还了得,不过笔者笃定肯定是用法的锅,不然就全乱套了。所以笔者去Review他的代码。

代码片段

  1. @Transacion(value="x")  
  2. public void s1() throw MyException{  
  3.     update(1);  
  4.     throwBusinessException(); 
  5.     update(2);  

乍看上去没啥问题。

思路

笔者用@Transaction注解也用了好几年了,从来没遇到过抛异常不回滚的情况。看他的用法也和笔者差不多呀?

然后笔者稍微思索了会,发现我写的代码和出问题的这一段稍稍有些不一样。我是这么写的:

  1. @Transacion(value="transManager")  
  2. public void s1(){  
  3.     update(1);  
  4.     update(2);  

貌似我从来没有在函数上加过throw MyException,难道是这段有问题?翻看MyException代码,发现它仅仅继承了Exception。

  1. class MyEception extends Exception { 

好像就这点不一样。而笔者自定义的Exception基本继承了RuntimeException的。

翻下Spring源码

按照这个思路,笔者去翻了下Spring的源码,看下它在声明式事务中的处理逻辑到底是什么,于是翻到了这一段处理事务异常的代码:

  1. TransactionAspectSupport.java 
  2. protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) { 
  3.     if (txInfo.transactionAttribute.rollbackOn(ex)) { 
  4.     }else
  5.         // We don't roll back on this exception. 
  6.         // Will still roll back if TransactionStatus.isRollbackOnly() is true
  7.         // 在checkedException的时候,不会被rollBack,会commit!!! 
  8.     } 
  9. @Override 
  10. public boolean rollbackOn(Throwable ex) { 
  11.     return (ex instanceof RuntimeException || ex instanceof Error); 

看代码逻辑就明白了,只有异常继承RuntimeException或者Error的时候才会回滚!好了,让业务开发改了下代码,问题解决了。

总结

遇到问题时,找到出问题代码段和类似的正确代码段的不同处,以此为切入,往往能抓住线索。

本文转载自微信公众号「解Bug之路」,可以通过以下二维码关注。转载本文请联系解Bug之路公众号。

 

责任编辑:武晓燕 来源: 解Bug之路
相关推荐

2021-06-15 16:17:19

Commit报错事务

2021-06-04 11:33:50

消息技巧排查

2021-05-19 14:03:48

磁盘故障

2021-05-20 10:02:50

系统Redis技巧

2022-09-25 22:12:07

事务SpringBoot

2022-12-28 08:17:19

异常处理code

2021-07-15 23:16:09

IO异常排查

2023-02-02 08:56:25

线程池线程submit

2022-09-24 13:21:34

Java服务异常

2021-03-01 08:16:44

Linux 内核代码

2011-12-21 11:18:59

Java

2020-11-18 10:16:52

数据库回滚事务

2020-07-08 07:50:50

OOM虚拟机Java

2019-04-11 08:45:27

2018-11-26 08:49:42

CPU排查负载

2012-05-29 16:25:45

Transaction

2021-03-11 14:28:11

bugLinux内核

2021-03-18 09:52:05

bugLinux内核

2022-07-27 11:45:43

iOS苹果系统

2020-01-07 22:15:43

TCP三次握手丢包
点赞
收藏

51CTO技术栈公众号