长事务(Long-Lived Transactions),顾名思义,就是执行时间较长的事务。比如,对于银行系统的数据库,每过一个阶段可能需要更新对应账户的利息。如果对应账号的数量非常大,例如对有1亿用户的表account,需要执行下列语句: .
UPDATE account
SET account_ total = account_ total + (1 + interest rate)
这时这个事务可能需要非常长的时间来完成。可能需要1个小时,也可能需要4、5
个小时,这取决于数据库的硬件配置。DBA和开发人员本身能做的事情非常少。然而,由于事务ACID的特性,这个操作被封装在一个事务中完成。这就产生了一个问题,在执行过程中,当数据库或操作系统、硬件等发生问题时,重新开始事务的代价变得不可接受。数据库需要回滚所有已经发生的变化,而这个过程可能比产生这些变化的时间还要长。因此,对于长事务的问题,有时可以通过转化为小批量(mini batch) 的事务来进行处理。当事务发生错误时,只需要回滚一部分数据。

伪代码:

void ComputeInterest (double interest_rate) llong last_account_done, max_account_no, log_size;int batch_size = 100000;EXEC SQL SELECT COUNT(*) INTO log_size FROM batchcontext;if(SQLCODE != 0 || log_size == 0)(EXEC SQL DROP TABLE IF EXISTS batchcontext;EXEC SQL CREATE TABLE batchcontext ( last_account_done BIGINT );last_account_done . O;INSERT INTO batchcontext SELECT O;
)
else (EXEC SQL SELECT last_account_no INTO last_account_done FROM batchcontext;
)EXEC SQL SELECT COUNT(*) INTO max_account_no FROM account LOCK IN SHARE MODE;WHILE ( last_ account_no < max_account_no ) (EXEC SQL START TRANSACTION;EXEC SQL UPDATE accountSET account_total = account_total * ( 1+interest_rate );WHERE account_noBETWEEN last_ account_noAND last_ account_ no + batch_ size;
EXEC SQL UPDATE batchcontext SET last_account_done  = last_ account_done + batch_size;
EXEC SQL COMMIT WORK;
last_ account_ done = last_ account_done + batch_size;
)

上述代码将一个需要处理1亿用户的大事务分解为每次处理10万用户的小事务,
通过批量处理小事务来完成大事务的逻辑。每完成-一个小事务,将完成的结果存放在batchcontext表中,表示已完成批量事务的最大账号ID。若事务在运行过程中产生问题,需要重做事务,可以从这个已完成的最大事务ID继续进行批量的小事务,这样重新开启事务的代价就显得比较低,也更容易让用户接受。batchcontext 表的另外一个好处是,在长事务的执行过程中,用户可以知道现在大概已经执行到了哪个阶段。比如一-共有1亿条的记录,现在表batchcontext中最大的账号ID为4000万,也就是说这个大事务大.概完成了40%的工作。
这里还有一个小地方需要注意,在从表account中取得max_ account no时,人为地
加上了一个共享锁,以保证在事务的处理过程中,没有其他的事务可以来更新表中的数据,这是有意义的,并且也是非常有必要的操作。
《整理自InnoDB存储引擎》

MySQL之长事务解析相关推荐

  1. mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?

    什么是慢查询.长事务 ? 慢查询 是指一条 SQL 的执行时间太长.比如在一个有100w条数据的表中,查询一条数据时未命中索引,从而通过全表扫描查询数据,这个查询会耗时很长.这就是一个 Long SQ ...

  2. mysql 长事务查询_MySQL长事务详解

    前言: 『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持.言归正传,本篇 ...

  3. 深入解析:MySQL对分布式事务 XA Transactions 的支持

    导读:MySQL对分布式事务(XA Transactions)进行了很好的支持,我们看看它是怎么做的,并实战验证其提供的分布式事务控制语句效果. MySQL从5.0.3开始,InnoDB存储引擎支持X ...

  4. mysql dml回滚_mysql binlog回滚/闪回,前滚, 分析各表DML情况, 找出长事务与大事务...

    简介 binlog_inspector通过解释mysql/mariadb binlog/relaylog实现以下三大功能: 1)flashback/闪回/回滚, 实现DML的回滚到任意时间或者位置. ...

  5. Mysql长事务总结

    一 长事务现象 1 PROCESSLIST 只能看到sleep时间较长,并不能看出来是事务 2 INNODB_TRX select t.*,to_seconds(now())-to_seconds(t ...

  6. mysql什么是长事务

    1.什么是长事务 首先我们先要知道什么是长事务,顾名思义就是运行时间比较长,长时间未提交的事务,也可以称之为大事务.这类事务往往会造成大量的阻塞和锁超时,容易造成主从延迟,要尽量避免使用长事务.

  7. MySQL(InnoDB剖析):46---事务之(长事务)

    长事务概述 长事务,就是执行时间较长的事务 比如,对于银行系统的数据库,每过一个阶段可能需要更新对应账户的利息.如果对应账号的数量非常大,例如对有1亿用户的表account,需要执行下列语句: 这时这 ...

  8. mysql如何查看事务日记_MySQL中的几种日志了解

    前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...

  9. 100道MySQL数据库面试题解析

    1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效如何字段类型是字符串,w ...

最新文章

  1. Python——字符串大小写转化
  2. 九维 Addon for SBO 功能说明及新版软件下载
  3. linux部署安装nexus私服
  4. [20150611]优化sql遇到问题.txt
  5. 支持国产处理器仿真的全数字实时仿真平台SkyEye与可信编译器L2C的核心翻译步骤
  6. linux下自己安装软件做成命令
  7. 怎么自动缩进_Python 的缩进是不是反人类的设计?
  8. openstack rocky 安装_ubuntu 18.04 安装网易云音乐
  9. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
  10. matlab存储为二进制txt,matlab读取内容为二进制的TXT文件
  11. 瑞星网络版杀毒软件安装部署
  12. HTML5游子吟网页的完整代码,游子吟古诗注释范文(5页)-原创力文档
  13. MySQL -update语句流程总结
  14. 众多交通工具3dm Rhino资源素材一键即可获取
  15. 安装nodejs时提示Leaving directory
  16. 目标检测与位姿估计(五):A Survey: Visual Place Recognition
  17. 智能音箱的五大核心技术
  18. DZ插件制作简易入门教程(自学手记)第一篇
  19. mysql 脚本库图各名称解析
  20. Latex同时引用多篇文献修改字体/表格/图片/参考文献颜色

热门文章

  1. Java 五子棋AI博弈树算法实现
  2. 你到底想要什么,通信欢迎你
  3. 教你UPS电池估算方法,UPS配置不再难
  4. 如何关闭android省流量,安卓手机怎么省流量 安卓手机省流量的方法
  5. Python和贝叶斯网络:贝叶斯理论(6)
  6. Adobe的PDF编辑软件Acrobat Pro DC 2023版本下载与安装教程
  7. 【网络安全】今天是网络安全日,谈谈网络安全
  8. 【安富莱专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现...
  9. 强化学习3(策略学习)
  10. JAVA学习-8种基本类型及其对应的封装类