前言每日BUG排查系列是一些简单的BUG排查,笔者将在这里介绍一些简单的BUG排查技巧,同时积累素材^_^。最近bug站有人反映,java应用程序操作数据库时,抛出异常,不回滚。这个还不错,但是笔者敢肯定,这肯定是usage的锅,不然就全搞砸了。于是作者去Review了他的代码。代码片段@Transacion(value="x")publicvoids1()throwMyException{update(1);throwBusinessException();update(2);}乍一看还不错。思路作者使用@Transaction注解好几年了,从来没有遇到过抛异常不回滚的情况。看他的用法和作者的差不多?然后作者想了想,发现我写的代码和有问题的部分略有不同。我是这样写的:@Transacion(value="transManager")publicvoids1(){update(1);update(2);}好像我从来没有在函数里面加过throwMyException,是不是这段有问题?查看MyException的代码,发现它只是继承了Exception。classMyEceptionextendsException{}在这一点上似乎有所不同。而笔者自定义的Exception基本继承自RuntimeException。按照这个思路,笔者去Spring的源码中查看它在声明式事务中的处理逻辑是怎样的,于是翻到了这段处理事务异常的代码:...exinstanceofRuntimeException||exinstanceofError);}看代码逻辑就明白了,只有异常继承RuntimeException或者Error才会回滚!嗯,让业务开发改代码,问题解决。综上所述,遇到问题时,找出有问题的代码段和类似的正确代码段的区别,并以此为切入点,往往能抓住蛛丝马迹。本文转载自微信公众号《Bug解决之路》,可通过以下二维码关注。转载本文请联系BUG解决公众号。
