首页 > 数据库 >【数据库】Update两阶段提交

【数据库】Update两阶段提交

时间:2025-01-23 18:31:06浏览次数:3  
标签:bin 事务 log 数据库 Update 阶段 提交 redo

为什么要两阶段提交

事务提交之后,redo log和bin log 都是需要1持久化到磁盘中,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。如:

以id=1,name = ‘小明’执行

update stu set name = '小红'  where id = 1 

会出现如下两种情况:

  • 如果在将redo log刷入到磁盘之后,Mysql突然宕机了,而bin log还没来得及写入。Mysql重启后,,通过redo log能将Buffer Pool中id = 1这行数据的name字段更新到‘小红’但是bin log由于没有写入,所以从库中的数据还是‘小明’,出现了主从不一致的情况
  • 如果bin log写入了磁盘之后,,Mysql突然宕机了,而redo log还没来得及写入。由于redo log没有写入数据,重启之后主库不存在这条数据,但是从库已经同步了这条数据就会出现,主从不一致的情况

Mysql为了避免出现两份日志之间的逻辑不一致的问题,使用‘两阶段提交’来解决,两阶段提交其实是解决分布式事务一致性协议的,它可以保证多个逻辑操作,要不成功,不要全都失败,不会出现半成功半失败的情况。

两阶段提交把单个事务提交分为两个阶段,分别是“准备”和“提交”阶段

两阶段提交的过程是怎么样的

当客户端执行commit语句或者在自动提交的情况下,Mysql内部开启一个XA事务,分为两个阶段来完成XA事务的提交

事务提交的过程分为两个阶段,就是将redo log的写入拆分为两个步骤:prepare和commit,中间在穿插写入bin log,具体步骤如下:

  • prepare阶段:将XID(内部XA事务的ID)写入到redo log,,同时将redo log对应的事务状态设置为prepare,然后将redo log持久化到磁盘
  • commit阶段:将XID写入到bin log然后将bin log持久化到磁盘,接着提交事务,将redo log状态设置为commit,此时该状态并不需要持久化到磁盘,只需要写入到文件系统的缓存页中就可以,因为只要bin log写到磁盘中成功,就算redo log状态还是prepare也没有关系,一样会被认为事务已经执行成功
异常重启会发送什么现象呢

不管是时刻A(redo log写入磁盘,bin log没有)出现问题还是时刻B(redo log和bin log都写入到磁盘,但是还没有写入commit标识)崩溃,此时得redo log都是处于prepare的状态

在Mysql重启之后,都会按照顺序扫描redo log文件,碰到处于prepare状态的redo log,就会拿着redo log中的XID去bin log中去查找是否存在这个XID:

  • 如果bin log中没有当前内部XA事务的XID,说明redo log完成了刷盘,但是bin log还没有刷盘,则回滚事务,对应时刻A
  • 如果bin log中有当前内部事务的XID,说明redo log和bin log都已经完成了刷盘,则提交事务,对应时刻B

可以看到,对于处于prepare阶段的redo log,既可以提交事务,也可以回滚事务,这取决于能否在bin log中查找到与redo log相同的XID,如果有就提交事务,没有就回滚事务。这样就可以保证redo log和 bin log的一致性

两阶段提交出现的问题

两个阶段虽然保证了两个日志文件的数据一致性,但是性能不高,主要的原因是:

  • 磁盘I/O次数过高:每一个事务提交都是需要两次刷盘(redo和bin)
  • 锁竞争激烈:两个阶段虽然可以保证“单个事务”的两个日志一致,但是不能保证“多个事务“情况下,两者提交的顺序一致性。因此,在两个阶段提交流程的基础上,还需要加上一个锁来保证提交的原子性,从而保证多事务的情况下,两个日志提交的顺序一致

为了解决上诉问题,引用有一个新的技术”组提交“,当多个事务提交的时候,会将多个bin log刷盘操作合并成一个,从而减少磁盘I/O的次数。如果10个事务一次排队刷盘的时间成本是10,那么将着10个事务一次性一起刷盘的时间成本近似.

引入组提交及之后,prepare阶段不变,只针对于commit阶段,将commit阶段拆分为三个过程:

  • flush阶段:多个事务按照将进入的顺序将bin log从cache写入文件(不刷盘)
  • sync阶段:对于bin log文件进行fsyn操作(多个事务的bin log合并有一次刷盘)
  • commit:各个事务按照顺序做InnoDB的提交操作

上面的每一个阶段都有一个队列,每个阶段都有锁进行保证事务写入的顺序性,第一个进入队列的事务会成为 leader,leader领导所在队列的所有事务,全权负责整队的操作,完成后通知队内其他事务操作结束

每个阶段引入队列,锁只是针对队列进行保护,不会锁住整个提交事务的整个过程。锁的粒度减小了,这样就可以多个阶段并发执行,提升效率

有 binlog 组提交,那有 redo log 组提交吗?

这个要看 MySQL 版本,MySQL 5.6 没有 redo log 组提交,MySQL 5.7 有 redo log 组提交

在 MySQL 5.6 的组提交逻辑中,每个事务各自执行 prepare 阶段,也就是各自将 redo log 刷盘,这样就没办法对 redo log 进行组提交。

所以在 MySQL 5.7 版本中,做了个改进,在 prepare 阶段不再让事务各自执行 redo log 刷盘操作,而是推迟到组提交的 flush 阶段,也就是说 prepare 阶段融合在了 flush 阶段。

这个优化是将 redo log 的刷盘延迟到了 fush 阶段之中,sync 阶段之前。通过延迟写 redo log 的方式为 redolog 做了一次组写入,这样 binlog 和 redo log 都进行了优化。

标签:bin,事务,log,数据库,Update,阶段,提交,redo
From: https://blog.csdn.net/loss_rose777/article/details/145264442

相关文章

  • 【Milvus向量数据库】AI应用开发
    一、Milvus介绍上一小节中,全面介绍了向量和向量数据库,今天详细介绍下其中比较出名的开源数据库Milvus。希望对你有帮助Milvus是一个开源的、高性能的向量数据库,专为海量向量数据的快速检索而设计。在人工智能、计算机视觉、推荐系统和其他需要处理大规模向量数据的领域有着广......
  • Oracle数据库归档满,无法连接数据库
    报错如下:查看日志,导致异常连接的问题是归档日志满导致的解决方案:1、可以进入rman使用rman删除归档su-oracleexportORACLE_SID=orclrmantarget/crosscheckARCHIVELOGall;deletenopromptexpiredarchivelogall;deletenopromptarchivelogallcompletedb......
  • C# SqlParameter设置值为0数据库实际为null的原因
    以前我也发现了这个问题,当时我是想通过SqlParameter插入一个int数据到数据库,类似下面这样 1MySqlParameter[]parameters=newMySqlParameter[]2{3newMySqlParameter("@order",0)4} 但是执行后,会发现数据库显示为null,当时没去细究原因,通过......
  • 深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具
    title:深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具date:2025/1/23updated:2025/1/23author:cmdragonexcerpt:在数据驱动的商业环境中,数据库管理系统必须具备高效的操作能力。而存储过程作为一种封装的数据库逻辑,提供了一种有效的解决方案,以增强数据库......
  • CF2063B Subsequence Update
    SubsequenceUpdate题目翻译:给定一个序列。在给定一个区间\([l,r]\),你可以任意选择几个数,使所选的所有数左右颠倒。求如何颠倒才能使区间内的所有数之和最小。思路:若要使整个区间内所有数和最少,那一定就使尽量小的数翻转到区间内。我们发现我们只需要在区间左边或右边选择几......
  • JSP拼车系统1fxmu(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着城市化进程的加快和交通拥堵问题的日益严重,拼车作为一种共享出行的方式,逐渐成为缓解交通压力、降低出行成本的有效途径。拼......
  • JSP暖暖猫窝系统a856q--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着宠物经济的兴起,宠物猫已成为许多家庭的重要成员。然而,传统的猫窝已无法满足现代宠物猫的生活需求。因此,开发一款智能、舒适......
  • JSP农副及衍生产品交易系统3qxs1--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着互联网技术的发展,电子商务已成为推动各行各业数字化转型的重要力量。在农副产品领域,传统的交易模式存在信息不对称、交易效......
  • JSP农业种植管理系统5kb33--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着科技的飞速发展,农业领域正逐步向智能化、信息化转型。农业种植管理作为农业生产的关键环节,其效率与质量直接影响农作物的产......
  • Prometheus+grafana实践:Doris数据库的监控
    Doris数据库背景Doris(ApacheDoris)是一个现代化的MPP(MassiveParallelProcessing,大规模并行处理)数据库,主要用于在线分析处理(OLAP)场景。Doris数据库的特点高性能:Doris采用了列式存储和MPP架构,能够对海量数据进行快速查询。易用性:提供了类似SQL的查询接口,易于上手和使用。实时......