Transactional超时时间控制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Transactional超时时间控制

项目使用的是spring+mybatis+mysql,今天,我需要把处理一个业务就是,当用户出金失败时,事务能够回滚,同时减少用户的等待时间,因为我发现当处理失败时,用户需要等上1分钟以上的时间,这是不合理的。那么经过一系列的调查发现:spring的事务超时(使用Java注解方式)和mysql InnoDB事务超时是相互关联的。

在一个需要进行事务回滚的方法上加入@Transactional的事务注解,timeout超时时间设置为2秒,也就是说发生事务回滚后,2秒钟后对用户响应。

@Transactional(timeout=2)
public int updateForzenMoney(MoneyTransfer moneyTransfer, int uid) {
    // 如果是出金请求,则预扣除冻结资金
    if (moneyTransfer.getType().intValue() == 1) {
        moneyTransferService.updateTotalmoneyForPerTransfermoney(uid, moneyTransfer.getAmount());
        // 将请求插入money_transfer表中
        moneyTransferService.addMoneyTransfer(moneyTransfer);
        return 1;
    } else {
        moneyTransferService.addMoneyTransfer(moneyTransfer);
        return 2;
    }
}

通过mysql控制台的模拟操作(强迫发生事务回滚),发现updateForzenMoney方法前后执行时间远远大于2秒的时间,为什么呢?

先想到的是不是mybatis的原因,因为mybatis在xml定义update语句时也提供了超时时间设置,见如下说明,
timeout单位是毫秒
这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。
OK,我对update语句加上超时2秒处理

继续执行,发现执行时间依然远远大于2+2+2,接近50毫秒,这期间又测试了很多种组合方式,然后我看到 mysql的配置文件(my.cnf)中,innodb_lock_wait_timeout=50 ,而我所使用的表刚好是innodb类型。

mysql> show variables like 'innodb_lock_wait_timeout';
Variable_name Value
innodb_lock_wait_timeout 50

1 row in set

ok,找到了他,那么到底是不是呢,修改一下
mysql> set
innodb_lock_wait_timeout = 10;
Query OK, 0 rows affected

mysql> show variables like 'innodb_lock_wait_timeout';
Variable_name Value
innodb_lock_wait_timeout 10

1 row in set
继续执行,发现执行时间接近了10秒左右,然后再将10秒设置为20秒,ok,测试出来的超时时间大概是20秒,说明这个思路是正确的,但是为什么spring的事务超时时间没有起到作用呢,继续调查

把mysql的时间再设置短一点,然后再次把spring的事务超时设置为5秒,把mybatis的超时去掉
mysql> set innodb_lock_wait_timeout = 1
;
Query OK, 0 rows affected

mysql> show variables like 'innodb_lock_wait_timeout';
Variable_name Value
innodb_lock_wait_timeout 1

1 row in set

@Transactional(timeout=5)
public int updateForzenMoney(MoneyTransfer moneyTransfer, int uid) {

然后再执行,看日志时间
DEBUG 2014-12-12 16:53:49,784 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: UPDATE money_us
DEBUG 2014-12-12 16:53:49,785 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters:
DEBUG 2014-12-12 16:54:00,795
事务回滚的时间差不多刚好是两个statement的事务执行时间5+5=10秒的时间 。

结论:spring的事务超时时间和mysql的事务超时时间是相互影响的!我最后确认的方案是,修改mysql的innodb超时时间为20秒,然后去掉Java方法上的超时时间
@Transactional
public int updateForzenMoney(MoneyTransfer moneyTransfer, int uid) {
再次,测试,事务的回滚时间大概是20秒。

总结:功夫不负有心人,只要一步步深入调查,什么问题终究会得出答案。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL 数据库
PgSQL常用脚本语句
PgSQL常用脚本语句
569 0
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
11月前
|
算法 调度 开发者
多线程编程核心:上下文切换深度解析
在多线程编程中,上下文切换是一个至关重要的概念,它直接影响到程序的性能和响应速度。本文将深入探讨上下文切换的含义、原因、影响以及如何优化,帮助你在工作和学习中更好地理解和应用多线程技术。
280 4
|
自然语言处理 监控 机器人
自然语言处理中的语义理解和生成技术
【8月更文第18天】自然语言处理(NLP)是计算机科学的一个重要分支,其目标是使计算机能够理解、解析和生成人类语言。近年来,基于Transformer架构的预训练模型(如BERT、GPT系列)已经极大地推动了NLP的发展。本文将探讨这些模型在对话系统、文本生成、情感分析等领域的应用,并讨论相关技术挑战。
778 1
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的质量管理与控制
【7月更文挑战第25天】 ERP系统中的质量管理与控制
941 2
|
开发工具 数据安全/隐私保护 git
git: 修改gitlab仓库提交地址
git: 修改gitlab仓库提交地址
761 0
|
存储 Apache 容器
Cookie持久化方案——PersistentCookieStore源码解读。
客户端登陆之后一般都会在本地持有某个cookie,在退出登录时将这个cookie清理掉。如果Request的body体中持有这个cookie,服务器就会认为客户端的用户处于登录状态。反之,就会认为用户没有登录。 假设用户一直处于登录状态,如果他关闭了应用,那么他的登录状态应该保存起来。这样的话,在他下次打开应用时,他的状态还是登录状态,不需要再次登录。 如何实现呢?很简单,将有效的cookie保存起来,需要的时候拿出来,塞进请求里面就ok了。
Cookie持久化方案——PersistentCookieStore源码解读。
Java的在类内部调用本类方法
Java的在类内部调用本类方法
994 0
|
域名解析 网络协议 安全
【域名解析DNS专栏】DNS-over-TLS与DNS-over-HTTPS:安全升级新标准
【5月更文挑战第26天】随着网络技术的发展,DNS协议面临安全挑战,DNS-over-TLS (DoT) 和 DNS-over-HTTPS (DoH) 作为解决方案出现,旨在通过加密增强隐私和安全。DoT使用TLS封装DNS查询,防止流量被窥探或篡改;DoH则利用HTTPS隐藏DNS查询。实施DoT需在客户端和服务器间建立TLS连接,DoH需DNS服务器支持HTTPS接口。这两种技术为网络安全提供支持,未来有望更广泛部署,提升网络环境的安全性。
1673 0