先抛出一个问题,如下,Spring事务的默认超时时间是多少?

先来看如下代码,方法上加上了事务注解,并设置事务超时时间为2s。两者的区别是一个是在插入之前Sleep了3秒,一个是在插入之后Sleep了3秒。测试时发现,前者会抛事务超时异常,而后者则正常插入了,这是为什么呢?

如上,insertStuTimeOut1方法抛出了事务超时异常。我们可以观察它异常栈信息,来分析它是如何一步步走到超时异常的。

  1. 我们知道,Mybatis执行SQL是将SQL封装成一个Statement去执行。如下这边根据方法名称知道它是在准备Statement,而在这里它调用了SpringManagedTransaction的getTimeout方法,这里面会检测事务是否超时了。(Mybatis在3.4.0版本及以上才会去检测Spring事务是否超时,https://github.com/mybatis/spring/issues/115)

  1. 现在来看下为什么insertStuTimeOut1方法超时了,而insertStuTimeOut2方法没有超时?原因刚刚也提到了,Mybatis在执行SQL前会去检测事务是否超时?关键是两者Sleep的时间,insertStuTimeOut2方法中SQL执行时还没有Sleep,所以自然不会超时了。如下图所示,Mybatis是先生成Statement,在生成Statement时就会去检测是否超时。然后才会去执行SQL。

  1. 步骤1中有一个关键的变量deadline,顾名思义,它是截止日期,如果当前似乎超过了deadline,说明超时了需要回滚。那么deadline是在哪边设置的呢?它是在创建事务的时候设置的。

  1. 现在来回答文章开头的问题,Spring默认的事务超时时间是多少?这是@Transactional注解中对事务超时的默认值设置,默认是-1。

在步骤3) 中创建事务给事务设置超时时间时,会调用determineTimeout方法来计算事务超时时间,如果是默认的则返回defaultTimeout,也就是-1。

那么在这一步就不会初始化deadline变量,也就是说deadline变量为null。

而在这一步getTimeout中会去调用holder.getTimeout方法判断deadline是否为null,如果为null,则不会去检测事务是否超时。也就是说,如果不手动设置@Transactional的timeout属性,Mybatis是不会去检测Spring事务是否超时的。

public boolean hasTimeout() {   return (this.deadline != null);
}

思考分析,Mybatis这样检测Spring事务是否超时有没有什么问题?它在SQL执行前去执行SQL超时判断?如果SQL执行很长时间,则Mybatis不会认为它是超时的而去回滚它。这本质上是一种同步检测机制。而Hystrix启动单独的线程去检测超时,线程启动的时间刚好就是任务超时的时间,这是一种异步检测机制。

Spring事务超时探讨相关推荐

  1. 【转】Spring事务超时时间可能存在的错误认识

    2019独角兽企业重金招聘Python工程师标准>>> 1.先看代码 1.1.spring-config.xml Java代码   <bean id="dataSou ...

  2. spring事务超时

    转载自http://jinnianshilongnian.iteye.com/blog/1986023 1.先看代码 1.1.spring-config.xml Java代码 <bean id= ...

  3. Spring事务传递性探讨

    本篇主要讨论下面几点: 一: Spring 事务的传递性介绍 二: 第三方调用含有事务的Service抛异常方法探讨 一: Spring 事务的传递性介绍 事务传播行为,所谓事务的传播行为是指,如果在 ...

  4. Spring 事务超时时间

    问题:生产环境下插入大量数据,日志报错,数据最终没有入库,显示state报错. 测试和结论:Transactional中设置超时时间5秒,代码中先插入数据,后sleep数秒,没有报错.用另外一个线程更 ...

  5. 妙用Spring的事务超时时间timeout

    1.如何设置Spring事务超时时间 在方法上加注解 @Transactional(rollbackFor= Exception.class,timeout=10) 注:timeout 单位:秒 增加 ...

  6. Spring事务管理-超时时间

    关于Spring事务超时时间的实现,一直都没太弄清楚,终于在看到一篇事务超时文章后,通过测试用例证明通常情况下@Transactional中配置的timeout都是无效的. 首先说明下测试的注意事项, ...

  7. Spring事务的那些坑,这里都给你总结好了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:蚊 ...

  8. 《深入理解分布式事务》第三章 Spring 事务的实现原理

    <深入理解分布式事务>第三章 Spring 事务的实现原理 文章目录 <深入理解分布式事务>第三章 Spring 事务的实现原理 一.Spring 事务原理 1.JDBC 直接 ...

  9. Spring(二十二):Spring 事务

    事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性. 事务就是一系列的动作,它们被当做一个单独的工作单元.这些动作要么全部完成,要么全部不起作用. 事务的是四个关键 ...

最新文章

  1. mysql update in_mysql update join优化update in查询效率
  2. 本地如何使用phpstudy环境搭建多站点
  3. Visio替代图表工具 - 为什么Visual Paradigm Online?
  4. 有关绑定没有数据显示的问题
  5. python中的散点图代码-python – 带有图例的matplotlib散点图
  6. 十大经典排序算法动画与解析
  7. 在Visual Studio 2010 里使用Nunit 进行Debug 测试
  8. 牛客 华为机试(我的代码记录)
  9. 推荐一款可以监控电脑软硬件和操作电脑的微信小程序,名叫HiPC
  10. 后端技术:数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!...
  11. hdoj 1257(暴力)
  12. PaddleOCR 文本检测训练+推理模型转换教程
  13. springboot 2中文手册_熬夜整理了一套最新版的Java面试题和开发手册(附答案)...
  14. 关于T_SQL中声明变量类型的基础知识。
  15. freetextbox java_FreeTextBox的应用技巧
  16. TCP通讯知识点总结
  17. Paddle进阶实战系列(二):智慧交通预测系统
  18. 根据身份证号判断性别、年龄、生日
  19. 《创业时代》,不带你们这样黑程序员的
  20. 【anaconda创建虚拟环境】

热门文章

  1. php注册榛子云短信验证,java + maven +榛子云短信 实现发送短信验证码功能
  2. 程序员的女朋友日常对话
  3. Git 基础知识 - 获取 Git 存储库
  4. centos7mimi mysql 安装_CentOS7 64位下MySQL5.7安装与配置(YUM)
  5. Flash WebGame 开发经验心得和PureMVC框架细说(2011-06-29 21:00:52)
  6. Shaders for Game Programmers and Artists(4) - 热雾效果
  7. 解决死锁的4种基本方法
  8. linux 怎么退出pr命令,Linux pr 命令 command not found pr 命令详解 pr 命令未找到 pr 命令安装 - CommandNotFound ⚡️ 坑否...
  9. 从日常数据开始培养运营的数据思维
  10. 《饮酒·其五》古诗鉴赏