zoukankan      html  css  js  c++  java
  • Spring事务超时、回滚的相关说明

    事务超时:
    @Transactional(timeout = 60)
    如果用这个注解描述一个方法的话,线程已经跑到方法里面,如果已经过去60秒了还没跑完这个方法并且线程在这个方法中的后面还有涉及到对数据库的增删改查操作时会报事务超时错误(会回滚)。
    如果已经过去60秒了还没跑完但是后面已经没有涉及到对数据库的增删改查操作,那么这时不会报事务超时错误(不会回滚)。
     
    答案是 RuntimeException或者Error。
    注意:如果事务在try{}catch(Exception e){e.printStackTrace();}中跑,并且catch中只是打印e的话,那么事务不会rollback。因为异常被catch掉了,框架不知道发生了异常。
    如果想要rollback,可以加上rollbackFor=Exception.class,然后:
    在方法上添加 throws  Exception,将方法中出现的异常抛出给spring事务,
    ②去掉方法体中的try catch
    ③catch (Exception e) {  throw e;}继续向上抛,目的是让spring事务捕获这个异常。
    rollbackFor=Exception.class,catch(){
        throw new RunTimeException();
    }
    如果不加rollbackFor=Exception.class,抛出new Exception() 是不会回滚的。Spring源码如下:
    public boolean rollbackOn(Throwable ex) { 
         return (ex instanceof RuntimeException || ex instanceof Error);
    如果是RuntimeException或Error的话,就返回True,表示要回滚,否则返回False,表示不回滚。
    只有spring事务捕获到Exception异常后,@Transactional(rollbackFor=Exception.class),才会起到应有的作用;catch (Exception e) {            e.printStackTrace();        }这句是捕获try中出现的Exception然后将异常信息打印出来,仅仅是打印出来,然后什么也没干。

    @Transactional(timeout = 60,rollbackFor=Exception.class)与rollbackFor=Exception.class的作用是1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
    2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
    checked Unchecked exception是运行时错误。
     
  • 相关阅读:
    自动化测试用例设计实例
    day07 python2与python3 编码
    day06-2 数据结构
    遇到一个关于C#调用Microsoft.Office.Interop.Word实例化的一个问题
    关于C#调用matlab生成的dll的一些经验(亲测)
    javascript 检测浏览类型和版本
    图片自适应完美兼容IE8
    Java VS .NET:Java与.NET的特点对比
    【C#点滴记录】ASP.NET 使用C# 导出Word 和Excel
    关于现在IT行业从业者一些建议
  • 原文地址:https://www.cnblogs.com/xubiao/p/7575693.html
Copyright © 2011-2022 走看看