Spring事务超时探讨
先抛出一个问题,如下,Spring事务的默认超时时间是多少?
先来看如下代码,方法上加上了事务注解,并设置事务超时时间为2s。两者的区别是一个是在插入之前Sleep了3秒,一个是在插入之后Sleep了3秒。测试时发现,前者会抛事务超时异常,而后者则正常插入了,这是为什么呢?
如上,insertStuTimeOut1方法抛出了事务超时异常。我们可以观察它异常栈信息,来分析它是如何一步步走到超时异常的。
- 我们知道,Mybatis执行SQL是将SQL封装成一个Statement去执行。如下这边根据方法名称知道它是在准备Statement,而在这里它调用了SpringManagedTransaction的getTimeout方法,这里面会检测事务是否超时了。(Mybatis在3.4.0版本及以上才会去检测Spring事务是否超时,https://github.com/mybatis/spring/issues/115)
- 现在来看下为什么insertStuTimeOut1方法超时了,而insertStuTimeOut2方法没有超时?原因刚刚也提到了,Mybatis在执行SQL前会去检测事务是否超时?关键是两者Sleep的时间,insertStuTimeOut2方法中SQL执行时还没有Sleep,所以自然不会超时了。如下图所示,Mybatis是先生成Statement,在生成Statement时就会去检测是否超时。然后才会去执行SQL。
- 步骤1中有一个关键的变量deadline,顾名思义,它是截止日期,如果当前似乎超过了deadline,说明超时了需要回滚。那么deadline是在哪边设置的呢?它是在创建事务的时候设置的。
- 现在来回答文章开头的问题,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事务超时探讨相关推荐
- 【转】Spring事务超时时间可能存在的错误认识
2019独角兽企业重金招聘Python工程师标准>>> 1.先看代码 1.1.spring-config.xml Java代码 <bean id="dataSou ...
- spring事务超时
转载自http://jinnianshilongnian.iteye.com/blog/1986023 1.先看代码 1.1.spring-config.xml Java代码 <bean id= ...
- Spring事务传递性探讨
本篇主要讨论下面几点: 一: Spring 事务的传递性介绍 二: 第三方调用含有事务的Service抛异常方法探讨 一: Spring 事务的传递性介绍 事务传播行为,所谓事务的传播行为是指,如果在 ...
- Spring 事务超时时间
问题:生产环境下插入大量数据,日志报错,数据最终没有入库,显示state报错. 测试和结论:Transactional中设置超时时间5秒,代码中先插入数据,后sleep数秒,没有报错.用另外一个线程更 ...
- 妙用Spring的事务超时时间timeout
1.如何设置Spring事务超时时间 在方法上加注解 @Transactional(rollbackFor= Exception.class,timeout=10) 注:timeout 单位:秒 增加 ...
- Spring事务管理-超时时间
关于Spring事务超时时间的实现,一直都没太弄清楚,终于在看到一篇事务超时文章后,通过测试用例证明通常情况下@Transactional中配置的timeout都是无效的. 首先说明下测试的注意事项, ...
- Spring事务的那些坑,这里都给你总结好了!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:蚊 ...
- 《深入理解分布式事务》第三章 Spring 事务的实现原理
<深入理解分布式事务>第三章 Spring 事务的实现原理 文章目录 <深入理解分布式事务>第三章 Spring 事务的实现原理 一.Spring 事务原理 1.JDBC 直接 ...
- Spring(二十二):Spring 事务
事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性. 事务就是一系列的动作,它们被当做一个单独的工作单元.这些动作要么全部完成,要么全部不起作用. 事务的是四个关键 ...
最新文章
- mysql update in_mysql update join优化update in查询效率
- 本地如何使用phpstudy环境搭建多站点
- Visio替代图表工具 - 为什么Visual Paradigm Online?
- 有关绑定没有数据显示的问题
- python中的散点图代码-python – 带有图例的matplotlib散点图
- 十大经典排序算法动画与解析
- 在Visual Studio 2010 里使用Nunit 进行Debug 测试
- 牛客 华为机试(我的代码记录)
- 推荐一款可以监控电脑软硬件和操作电脑的微信小程序,名叫HiPC
- 后端技术:数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!...
- hdoj 1257(暴力)
- PaddleOCR 文本检测训练+推理模型转换教程
- springboot 2中文手册_熬夜整理了一套最新版的Java面试题和开发手册(附答案)...
- 关于T_SQL中声明变量类型的基础知识。
- freetextbox java_FreeTextBox的应用技巧
- TCP通讯知识点总结
- Paddle进阶实战系列(二):智慧交通预测系统
- 根据身份证号判断性别、年龄、生日
- 《创业时代》,不带你们这样黑程序员的
- 【anaconda创建虚拟环境】
热门文章
- php注册榛子云短信验证,java + maven +榛子云短信 实现发送短信验证码功能
- 程序员的女朋友日常对话
- Git 基础知识 - 获取 Git 存储库
- centos7mimi mysql 安装_CentOS7 64位下MySQL5.7安装与配置(YUM)
- Flash WebGame 开发经验心得和PureMVC框架细说(2011-06-29 21:00:52)
- Shaders for Game Programmers and Artists(4) - 热雾效果
- 解决死锁的4种基本方法
- linux 怎么退出pr命令,Linux pr 命令 command not found pr 命令详解 pr 命令未找到 pr 命令安装 - CommandNotFound ⚡️ 坑否...
- 从日常数据开始培养运营的数据思维
- 《饮酒·其五》古诗鉴赏