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

长事务概述

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

  • 这时这个事务可能需要非常长的时间来完成。可能需要1个小时,也可能需要4、5个小时,这取决于数据库的硬件配置
  • DBA和开发人员本身能做的事情非常少。然而,由于事务的ACID的特性,这个操作被封装在一个事务中完成。这就产生了一个问题,在执行过程中,当数据库或操作系统、硬件等发生问题时,重新开始事务的代价非常多
  • 数据库需要回滚所有已经发生的变化,而这个过程可能比产生这些变化的时间还要长。因此,对于长事务的问题,有时可以通过转换为小批量的事务来进行处理。当事务发生错误时,只需要回滚一部分数据,然后接着上次已完成的事务继续进行
  • 例如,对于上面讨论的银行利息问题,可以通过分解为小批量事务来完成,下面给出了伪代码,既可以通过程序完成,也可以通过存储过程完成:

  • 上面代码需要将处理1亿用户的大事务分解为每次处理10万用户的小事务,通过批量处理小事务来完成大事务的逻辑。每完成一个小事务,将完成的结果存在batchcontext表中,表示已完成批量事务的最大账号ID。若事务在运行过程中产生问题,需要重做事务,可以从这个已完成的最大事务ID继续进行批量的小事务,这样重新开启事务的代价就显得比较低,页更容易让用户接受。batchcontext表的另外一个好处是,在长事务的执行过程中,用户知道在大概已经执行到哪个阶段
  • 这里还有一个需要注意的地方,在从表account取得max_account_no时,人为地加上了一个共享锁,以保证在事务的处理过程中,没有其他事务可以来更新表中的数据
发布了1481 篇原创文章 · 获赞 1026 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/104372518