先抛出一个问题,如下,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. mlc tlc slc qlc_看了这么多固态硬盘科普,终于真正搞明白TLC闪存和SLC缓存
  2. 2018帮助_字节跳动扶贫获“北京市扶贫协作奖”,一年帮助8万贫困人口增收
  3. 图解Google Android内核编译教程
  4. Dijkstra算法的c++实现
  5. 中考计算机考试作文,中考理化实验计算机考试作文
  6. 【IT资讯】年薪170万码农征友,条件让网友炸锅……
  7. 幂等问题-概念上的通俗解释(未完待续)
  8. 【Spring】Spring 使用 Redis 事务
  9. 大数据之_数据采集Flume_Flume了解_学习内容介绍---Flume工作笔记002
  10. java react_Java 9React流
  11. 201671030126 词频统计软件项目报告
  12. windows定时自动运行R脚本的正确姿势
  13. 《Python编程初学者指南》——第1章 启程:Game Over程序 1.1 剖析Game Over程序
  14. 无共享模式的数据架构
  15. 史上最真实的网络飙车游戏
  16. HDU 1166 敌兵布阵 线段树 单点修改 区间查询
  17. 抖音SEO,抖音seo优化
  18. COVID应对小tips
  19. 猿如意---初学者的一盏明灯---程序员的宝藏app
  20. 从事数字化转型的你,搞清楚这些数据类基础理念了吗?数据仓库、数据集市、数据湖、数据中台

热门文章

  1. c语言stm32串口控制单片机,USART1-RGB-control 实现STM32F103单片机的串口控制RGB三色LED灯 - 下载 - 搜珍网...
  2. wps打开共享文件时提示另一用户正在编辑中
  3. python 小学生教材_事实上,自从Python编进小学生教材后......
  4. 浙江工业大学大学-使用MindStudio进行starnet_resnet34_vd模型在昇腾环境离线推理-图文案例
  5. 流氓软件(突然出现的提示框)
  6. 【论文解读 ICLR 2020 | Jure Leskovec组】Query2box: Reasoning over KGs in Vector Space using Box Embedding
  7. win7计算机没有光驱图标不见了,win7系统光驱图标为什么不见了?该如何处理?...
  8. sentence_transformers 语义搜索,语义相似度计算,图片内容理解,图片与文字匹配。
  9. Firefox在iOS设备上登陆国际版账号
  10. 【已解决】torch==1.9.1+cu111无法安装