日常Bug排查系列都是日常一些简单Bug排查,笔者将在这里介绍一些排查Bug的查抛简单技巧,同时顺便积累素材^_^。异常 最近有人反映java应用操作数据库的日常时候,抛异常不回滚。查抛这还了得,异常不过笔者笃定肯定是日常用法的锅,不然就全乱套了。查抛所以笔者去Review他的异常代码。 乍看上去没啥问题。日常 笔者用@Transaction注解也用了好几年了,查抛从来没遇到过抛异常不回滚的异常情况。看他的源码库日常用法也和笔者差不多呀? 然后笔者稍微思索了会,发现我写的查抛代码和出问题的这一段稍稍有些不一样。我是异常这么写的: 貌似我从来没有在函数上加过throw MyException,难道是这段有问题?翻看MyException代码,发现它仅仅继承了Exception。 好像就这点不一样。而笔者自定义的Exception基本继承了RuntimeException的。 按照这个思路,笔者去翻了下Spring的源码,看下它在声明式事务中的处理逻辑到底是什么,云服务器提供商于是翻到了这一段处理事务异常的代码: 看代码逻辑就明白了,只有异常继承RuntimeException或者Error的时候才会回滚!好了,让业务开发改了下代码,问题解决了。 遇到问题时,找到出问题代码段和类似的正确代码段的不同处,以此为切入,往往能抓住线索。 本文转载自微信公众号「解Bug之路」,可以通过以下二维码关注。转载本文请联系解Bug之路公众号。 前言
Bug现场
代码片段
@Transacion(value="x") public void s1() throw MyException{ update(1); throwBusinessException(); update(2); } 思路
翻下Spring源码
总结