mysql的事务过程

1.三个主要文件:binlog、redolog和undolog

  • binlog主要用来对数据库进行数据备份、崩溃恢复和数据复制等操作
    • binlog则适用于所有存储引擎

    • binlog是MySQL用于记录数据库中的所有DDL语句和DML语句的一种二进制日志,记录了所有对数据库结构和数据的修改操作,如INSERT、UPDATE和DELETE等。

    • MySQL的bin log主要支持三种格式,分别是statement、row以及mixed

      • 当binlog的格式为statement时,binlog 里面记录的就是 SQL 语句的原文会导致主从不一致的问题

      • 当binlog的格式为ROW格式时,bin log会记录每个数据更改的具体行的细节,不会导致主从不一致的问题

      • 当binlog的格式为mixed格式时,自动在row和statement中互相切换选择一个,在RR下,row和statement都可以生效,但是在RC下,只有row格式才能生效

  • redo log和undo log主要用于事务管理,redolog用来做恢复,undolog用来做回滚。

    • MySQL会利用Redo Log记录事务的所有数据更改,将事务所做的修改持久化到磁盘中

    • MySQL会将事务修改前的数据记录到Undo Log中,如果事务需要回滚,则会从Undo Log中找到相应的记录来撤销事务所做的修改。Undo Log还支持MVCC(多版本并发控制)机制,用于在并发事务执行时提供一定的隔离性。

    • redo log和undo log只适用于InnoDB存储引擎,因为要支持事务。而不适用于MyISAM等其他存储引擎

2.什么是数据库事务

  • 数据库事务定义:

    • 数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位

  • 事务应该具有4个属性(ACID)

    • 原子性Atomicity

      • 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

    • 一致性Consistency

      • 事务应确保数据库的状态从一个一致状态转变为另一个一致状态

      • 一致状态的含义是数据库中的数据应满足完整性约束。

    • 隔离性Isolation

      • 多个事务并发执行时,一个事务的执行不应影响其他事务的执行

    • 持久性Durability

      • 一个事务一旦提交,他对数据库的修改应该永久保存在数据库中

  • 注意:InnoDB存储引擎会对SELECT * 这种普通的读取操作自动开启一个隐式事务。
    InnoDB的所有操作都可以说是在事务的上下文中执行的,包括读取操作和修改操作。

3.一次事务是怎么实现的

  • 以InnnoDB的update操作为例子

    • 在Buffer Pool中读取数据,如果没有,从磁盘中读取数据页到Buffer Pool中

    • 在修改操作前,通过UndoLog记录修改前的数据,然后由1个后台线程定时刷新到磁盘中的

    • 在Buffer Pool中更新数据,并将相关数据页设置为脏页,并将修改记录到RedoLog中

    • 修改完毕之后会提交事务,在提交事务时会记录binlog和redo Log到磁盘,这个过程会发生二阶段提交

    • 提交后,InnoDB会将Buffer Pool中的脏页通过异步线程写入磁盘

4.什么是事务的二阶段提交

  • MySQL事务的2阶段提交

    • 其实就是保证binlog和redolog一致性的一种手段。

  • 2阶段提交过程

    • Prepare 阶段

      • 将 XID( 事务 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘

    • Commit 阶段

      • 把 XID 写入到 binlog,然后将 binlog 持久化到磁盘

      • 将 redo log 状态设置为 commit

  • 为什么这个过程需要用2阶段提交的方式呢?

    • 我们执行一条SQL语句时,会发生如下情况:

      • redo log 成功,bin log失败。在MySQL重启后,可以根据redolog更新记录,binlog由于没写成功,主备同步的时候会导致主备库之间数据不一致

      • 写入binlog成功,写入redolog失败。在MySQL重启之后,由于redo log还没写,数据库记录还是旧值。在做主备同步的时候,binlog已经写入成功了就会把新值同步到备库

  • 二阶段如何保持一致性的

    • redo log (prepare阶段)写入成功,bin log写入失败,重启后直接回滚事务即可

    • redo log (prepare阶段)写入成功,bin log写入后崩溃,重启后检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务

    • redo log (commit阶段)写入失败,重启后检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务

5.MySQL主从复制的过程

  • 主从复制的过程

    • 主服务器通过binlog dump线程将更新操作记录到binlog

    • 从服务器的I/O线程会与binlog dump线程交互,从服务器的I/O线程从主服务器拉取binlog并存入relay log,SQL线程则读取relay log并执行其中的SQL操作以更新数据表。

  • 主从复制方式
    • 异步复制:主库执行完一个事务之后,立刻反馈给客户端
    • 全同步复制:主库执行完一个事务之后,所有从库完成数据复制之后,在反馈给客户端
    • 半同步复制:主库执行完一个事务之后,一个从库完成数据复制之后,在反馈给客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值