iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL事务的提交过程
  • 748
分享到

MySQL事务的提交过程

2024-04-02 19:04:59 748人浏览 独家记忆
摘要

本篇内容介绍了“Mysql事务的提交过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL事务提交过

本篇内容介绍了“Mysql事务的提交过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

MySQL事务提交过程
开启binlog后事务提交流程会变成两阶段提交,这里的两阶段提交并不涉及分布式事务,当然mysql把它称之为内部xa事务(Distributed Transactions),与之对应的还有一个外部xa事务。


这里所谓的两阶段提交分别是prepare阶段和commit阶段。


内部xa事务主要是mysql内部为了保证binlog与redo log之间数据的一致性而存在的,这也是由其架构决定的(binlog在mysql层,而redo log 在存储引擎层);


外部xa事务则是指支持多实例分布式事务,这个才算是真正的分布式事务。


既然是xa事务,必然涉及到两阶段提交,对于内部xa而言,同样存在着提交的两个阶段。


下文会结合源码详细解读内部xa的两阶段提交过程,以及各种情况下,mysqld crash后,mysql如何恢复来保证事务的一致性。

数据库版本:5.6.16


操作系统版本:Centos 6.5


配置文件参数:
log-bin=/my/log/mysql-bin


binlog_fORMat=ROW


set autocommit=0


innodb_support_xa=1


sync_binlog=1


innodb_flush_log_at_trx_commit=1


【innodb_flush_log_at_trx_commit=1,sync_binlog=1


不同的模式区别在于,写文件调用write和落盘fsync调用的频率不同,所导致的后果是mysqld 或 os crash后,不严格的设置可能会丢失事务的更新。


双一模式是最严格的模式,这种设置情况下,单机在任何情况下不会丢失事务更新。】




测试条件:
set autocommit=0;


DROP TABLE IF EXISTS `user`;


CREATE TABLE `user` (


`id` int(20) NOT NULL,


`account` varchar(20) NOT NULL,


`name` varchar(20) NOT NULL,


PRIMARY KEY (`id`),


KEY `id` (`id`) USING BTREE,


KEY `name` (`name`) USING BTREE


) ENGINE=InnoDB DEFAULT CHARSET=utf8;




测试语句:
insert into user values(1, 'sanzhang', '张三');


commit;


prepare阶段:


    1.设置undo state=TRX_UNDO_PREPARED; //trx_undo_set_state_at_prepare调用


    2.刷事务更新产生的redo日志;【步骤1产生的redo日志也会刷入】
    
    
MYSQL_BIN_LOG::prepare


ha_prepare_low


    {


engine:


binlog_prepare


innobase_xa_prepare


mysql:


trx_prepare_for_mysql


{


                1.trx_undo_set_state_at_prepare    //设置undo段的标记为TRX_UNDO_PREPARED


                2.设置事务状态为TRX_STATE_PREPARED


                3.trx_flush_log_if_needed  //将产生的redolog刷入磁盘


            }


     }
     
     


commit阶段:


   1.将事务产生的binlog写入文件,刷入磁盘;


   2.设置undo页的状态,置为TRX_UNDO_TO_FREE或TRX_UNDO_TO_PURGE;  // trx_undo_set_state_at_finish调用


   3.记录事务对应的binlog偏移,写入系统表空间; //trx_sys_update_mysql_binlog_offset调用
   
MYSQL_BIN_LOG::commit


    ordered_commit


   {


1.FLUSH_STAGE


        flush_cache_to_file  //  刷binlog


2.SYNC_STAGE


        sync_binlog_file    //Call fsync() to sync the file to disk.


3.COMMIT_STAGE


        ha_commit_low


        {


            binlog_commit


            innobase_commit   


                trx_commit(trx) 


                {


                    trx_write_serialisation_history(trx, mtr);  //更新binlog位点,设置undo状态


                    trx_commit_in_memory(trx, lsn); //释放资源,清理保存点列表,清理回滚段


                }        


        } 


    }
    
在任何情况下(机器掉电)mysqld crash或者os crash,MySQL仍然能保证数据库的一致性。数据的一致性是如何做到的哪?正是二阶段提交。


我们结合几种场景来分析下二阶段提交是如何做到的:


1.prepare阶段,redo log落盘前,mysqld crash


2.prepare阶段,redo log落盘后,binlog落盘前,mysqld crash


3.commit阶段,binlog落盘后,mysqld crash


对于第一种情况,由于redo没有落盘,毫无疑问,事务的更新肯定没有写入磁盘,数据库的一致性受影响;


对于第二种情况,这时候redo log写入完成,但binlog还未写入,事务处于TRX_STATE_PREPARED状态,这是提交还是回滚呢?


对于第三种情况,此时,redo log和binlog都已经落盘,只是undo状态没有更新,虽然redo log和binlog已经一致了,事务是否应该提交?

我们结合mysqld异常重启后的执行逻辑以及关键的源代码。

对于第三种情况,我们可以搜集到未提交事务的binlog event,所以需要提交;

对于第二种情况,由于binlog未写入,需要通过执行回滚操作来保证数据库的一致性。

异常重启后,如何判断事务该提交还是回滚


1.读binlog日志,获取崩溃时没有提交的event;  //info->commit_list中含有该元素


2.若存在,则对应的事务要提交;否则需要回滚。

判断事务提交或回滚源码如下:

MySQL事务的提交过程

上面讨论了两阶段提交的基本流程,以及服务器异常crash后,mysql如何重启恢复保证binlog和数据的一致性。


简而言之,对于异常的xa事务,若binlog已落盘,则事务应该提交;binlog未落盘,则事务就应该回滚。


//异常重启后,回滚流程

innobase_rollback_by_xid

rollback_by_xid

trx_rollback_resurrected

    trx_rollback_active

        row_undo

        { //从回滚页获取undo记录 //分析undo记录类型 if (insert)

                row_undo_ins else row_undo_mod

        }



//异常重启后,提交流程

commit_by_xid

trx_commit_for_mysql


//写binlog接口

handler.cc:binlog_log_row

sql/binlog.cc:commit

mysys/my_sync:my_sync

sql/binlog.cc:sync_binlog_file

handler/ha_innodb.cc:innobase_xa_prepare

binlog日志文件是为了解决MySQL主从复制功能而引入的一份新日志文件,它包含了引发数据变更的事件日志集合

从库请求主库发送 binlog 并通过日志事件还原数据写入从库,所以从库的数据来源为 binlog。

这样 MySQL 主库只需做到 binlog 与本地数据一致就可以保证主从库数据一致(暂且忽略网络传输引发的主从不一致)。

“MySQL事务的提交过程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL事务的提交过程

本文链接: https://www.lsjlt.com/news/60250.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL事务的提交过程
    本篇内容介绍了“MySQL事务的提交过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL事务提交过...
    99+
    2024-04-02
  • MySQL事务提交的流程
    本篇内容介绍了“MySQL事务提交的流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • MySQL层事务提交的流程
    本篇内容主要讲解“MySQL层事务提交的流程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL层事务提交的流程”吧!本节将来解释一下MySQL层详细的提交...
    99+
    2024-04-02
  • 找出未提交的MySQL线程/事务
    找出未提交的MySQL线程/事务:SELECT * from information_schema.processlist;   这个能看到上面哪个SQL线程ID(下图的378号线程就是造...
    99+
    2024-04-02
  • PostgreSQL 源码解读(123)- MVCC#8(提交事务-实际提交过程)
    本节介绍了PostgreSQL提...
    99+
    2024-04-02
  • 如何理解MySQL层事务提交流程
    如何理解MySQL层事务提交流程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。部分栈帧:prepare栈帧(gdb) bt #0&n...
    99+
    2024-04-02
  • MySQL事务处理:自动提交与手动提交的区别
    MySQL事务处理:自动提交与手动提交的区别 在MySQL数据库中,事务是一组SQL语句的集合,要么全部执行成功,要么全部执行失败,保证了数据的一致性和完整性。在MySQL中,事务可以...
    99+
    2024-04-02
  • Mycat分布式事务两阶段提交过程是怎样的
    本篇文章为大家展示了Mycat分布式事务两阶段提交过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 两阶段提交过程可以用以下图...
    99+
    2024-04-02
  • Mysql之事务提交和隔离级别
    Mysql之事务提交和隔离级别一、事务是什么事务简言之就是一组SQL执行要么全部成功,要么全部失败。MYSQL的事务在存储引擎层实现。1、事务都有ACID特性:原子性(Atomicity):一个事务必须被视...
    99+
    2024-04-02
  • MySQL事务提交的三个阶段是什么
    本篇内容介绍了“MySQL事务提交的三个阶段是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!事务提交分...
    99+
    2024-04-02
  • mysql 5.5 lock tables与隐式事务提交commit
    结论:lock tables可以隐式提交其它会话的未提交事务 测试明细: ----session 1 mysql> start transaction; Query OK, 0 rows affec...
    99+
    2024-04-02
  • 怎么理解MySQL事务两段式提交
    本篇内容主要讲解“怎么理解MySQL事务两段式提交”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解MySQL事务两段式提交”吧!⒈两段式提交的目的:解决参...
    99+
    2024-04-02
  • MySQL中begin后事务为什么不提交
    这篇文章主要介绍“MySQL中begin后事务为什么不提交”,在日常操作中,相信很多人在MySQL中begin后事务为什么不提交问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 如何理解mysql隐式提交事务transaction
    如何理解mysql隐式提交事务transaction,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。隐式提交事务概述  事务是一个完整...
    99+
    2024-04-02
  • MySQL未提交事务造成的等待事件怎么解决
    本篇内容主要讲解“MySQL未提交事务造成的等待事件怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL未提交事务造成的等待事件怎么解决”吧! ...
    99+
    2024-04-02
  • mysql与MariaDB的交互过程
    本篇内容主要讲解“mysql与MariaDB的交互过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql与MariaDB的交互过程”吧!一、与 Maria...
    99+
    2024-04-02
  • 怎么在MySQL中找出未提交的事务信息
    本篇文章给大家分享的是有关怎么在MySQL中找出未提交的事务信息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql> s...
    99+
    2024-04-02
  • golang实现mysql数据库事务的提交与回滚
    MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务用来管理 insert,update...
    99+
    2024-04-02
  • mysql怎么查看事务是否自动提交
    要查看MySQL的事务是否自动提交,可以使用以下查询语句: SHOW VARIABLES LIKE 'autocommit...
    99+
    2024-04-02
  • MySQL中Spring管理的事务开启后不提交引起的事故
    1. 前言 了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改...
    99+
    2023-09-03
    spring mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作