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

前言

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

Bug现场

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

代码片段

@Transacion(value="x")
public void s1() throw MyException{
update(1);
throwBusinessException();
update(2);
}

乍看上去没啥问题。

思路

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

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

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

貌似我从来没有在函数上加过throw MyException,难道是这段有问题?

翻看MyException代码,发现它仅仅继承了Exception。

class MyEception extends Exception {
}

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

翻下Spring源码

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

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

看代码逻辑就明白了,只有异常继承RuntimeException或者Error的时候才会回滚!

好了,让业务开发改了下代码,问题解决了。

总结

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

最新文章

  1. Ubuntu中的快捷键
  2. java多线程系类:JUC原子类:01之框架
  3. Web开发中最致命的8个小错误
  4. byte数据的常用操作函数[转发]
  5. 怎么让一个项目里swift与OC可以兼容混合开发?
  6. php5.3新特性 之 mysql native driver(mysqlnd)
  7. 阅读《Effective C++》系列
  8. apache+tomcat整合后的编码问题
  9. 最原始的COM组件调用过程(不使用注册表信息)
  10. Careercup - Google面试题 - 5692127791022080
  11. yoga-moblie-res
  12. ANDROID_MARS学习笔记_S03_002_设置可见性及扫描蓝牙设备
  13. Java虚拟机--字节码指令集
  14. POJ 2524 并查集
  15. jquery收集--php收集所有post数据
  16. 537. Complex Number Multiplication
  17. 192 Word Frequency
  18. Unicode String to a UTF-8 TypedArray Buffer in JavaScript
  19. vue axios请求/响应拦截器
  20. 7、redis之使用spring集成commons-pool来操作常见数据类型

热门文章

  1. 【Spring】循环依赖
  2. 页面元素定位 - XPath
  3. java面试一日一题:讲下redo log
  4. 在Visual Studio 中使用git——使用git管理源代码(三)
  5. 02- Java搭建环境搭建
  6. 从苏宁电器到卡巴斯基(后传)第05篇:聊聊我对WannaCry产生的感慨
  7. LA2965侏罗纪(异或和为0的最大数字个数)
  8. POJ3114强连通+spfa
  9. Python JWT 介绍
  10. 面试题:ArrayList、LinkedList、Vector三者的异同?