当前位置: 首页 > news >正文

[2025]MySQL的事务机制是什么样的?redolog,undolog、binog三种日志的区别?二阶段提交是什么?ACID怎么保证的?主从复制的过程?

MySQL事务机制与日志系统详解

一、MySQL事务机制

1. 事务特性(ACID)

特性实现机制
原子性(Atomicity)undo log回滚
一致性(Consistency)约束检查+双写缓冲
隔离性(Isolation)MVCC+锁机制
持久性(Durability)redo log持久化

2. 事务隔离级别

级别脏读不可重复读幻读实现方式
读未提交可能可能可能无锁
读已提交不可能可能可能MVCC快照读
可重复读不可能不可能可能(InnoDB实际避免)一致性视图
串行化不可能不可能不可能读写锁

二、三大日志系统对比

1. redo log(重做日志)

作用

  • 确保事务持久性

  • 实现WAL(Write-Ahead Logging)机制

  • 崩溃恢复时重放已提交事务

特点

  • 物理日志(记录页的修改)

  • 循环写入(固定大小文件组)

  • InnoDB引擎特有

配置参数

innodb_log_file_size = 512M  # 单个日志文件大小
innodb_log_files_in_group = 2 # 日志文件数量

2. undo log(回滚日志)

作用

  • 事务回滚时恢复数据

  • 实现MVCC多版本控制

  • 提供一致性读视图

特点

  • 逻辑日志(记录反向SQL)

  • 存储在系统表空间或独立undo表空间

  • 随事务结束逐渐清理

存储结构

-- 查看undo表空间
SHOW VARIABLES LIKE 'innodb_undo%';

3. binlog(归档日志)

作用

  • 主从复制数据同步

  • 时间点恢复(PITR)

  • 审计功能

特点

  • Server层实现(所有引擎通用)

  • 逻辑日志(SQL语句或行事件)

  • 追加写入(可配置大小)

工作模式

模式写入时机性能安全性
STATEMENT事务提交低(函数结果可能不一致)
ROW事务提交高(记录行变化)
MIXED自动选择

三、二阶段提交(2PC)

1. 跨日志协调过程

2. MySQL实现流程

  1. 准备阶段

    • 写入redo log(处于prepare状态)

    • 写入undo log(用于回滚)

  2. 提交阶段

    • 写入binlog

    • 提交redo log(改为commit状态)

3. 崩溃恢复逻辑

  • binlog无记录:回滚事务(redo prepare但未commit)

  • binlog完整:提交事务(重放redo log)

四、ACID保证机制

1. 原子性实现

// 伪代码:事务执行过程
void execute_transaction() {write_undo_log(); // 记录回滚信息write_redo_log(PREPARE);execute_sql();write_binlog();write_redo_log(COMMIT); // 最终提交
}

2. 隔离性实现

MVCC核心结构

  • ReadView:包含m_ids(活跃事务ID列表)

  • 版本链:通过DB_ROLL_PTR指针串联undo log

可见性判断规则

  1. 版本trx_id < min(m_ids):可见(已提交)

  2. 版本trx_id ∈ m_ids):不可见(未提交)

  3. 版本trx_id > max(m_ids):不可见(未来事务)

3. 持久性保证

  • redo log刷盘策略

    innodb_flush_log_at_trx_commit = 1 # 每次提交刷盘
  • 双写缓冲:防止页断裂

    // 写入流程
    write_to_doublewrite_buffer();
    write_to_data_file();

五、主从复制过程

1. 复制原理

2. 详细步骤

  1. 主库

    • 事务提交时写入binlog

    • 通过dump线程发送事件

  2. 从库

    • IO线程:拉取binlog到relay log

    • SQL线程:重放relay log中的事件

    • 状态报告:SHOW SLAVE STATUS

3. 复制模式

模式原理优点缺点
异步主库不等待从库ACK高性能数据可能丢失
半同步至少一个从库ACK平衡性能与安全网络影响性能
GTID全局事务ID标识故障切换方便配置复杂

4. 配置示例

-- 主库配置
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';-- 从库配置
CHANGE MASTER TOMASTER_HOST='master_host',MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
START SLAVE;

六、关键优化参数

1. 事务相关

transaction-isolation = REPEATABLE-READ
innodb_rollback_on_timeout = ON

2. 日志相关

sync_binlog = 1 # binlog刷盘控制
innodb_flush_log_at_trx_commit = 1 # redo刷盘控制
binlog_format = ROW # 推荐使用ROW模式

3. 复制优化

slave_parallel_workers = 4 # 并行复制
slave_preserve_commit_order = ON # 保持事务顺序

相关文章:

  • Jasper and Stella: distillation of SOTA embedding models
  • Solr 与 传统数据库的核心区别
  • 学习黑客Linux 命令
  • Django框架介绍+安装
  • 工业元宇宙:从虚拟仿真到虚实共生
  • 【mathematica】常见命令
  • 【51单片机6位数码管显示时间与秒表】2022-5-8
  • NPP库中libnppi模块介绍
  • 启发式算法-遗传算法
  • 如何用更少的显存训练 PyTorch 模型
  • 深入理解 Spring MVC:DispatcherServlet 与视图解析机制​
  • CSDN积分详解(介绍、获取、用途)
  • Docker 使用与部署(超详细)
  • SpringCloud教程 — 无废话从0到1逐步学习
  • Mybatis学习(下)
  • python进阶(3)字符串格式化
  • 【翻译、转载】MCP 核心架构
  • 黑马商城(七)MQ高级
  • 【操作系统】哲学家进餐问题
  • 赋予网页健壮的灵魂 —— TypeScript(下)
  • 抚州一原副县长拉拢公职人员组建“吃喝圈”,长期接受打牌掼蛋等“保姆式”服务
  • 科普|“小石头,大麻烦”,出现输尿管结石如何应对?
  • 人民日报评论员:因势利导对经济布局进行调整优化
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 两部门调度部署“五一”假期安全防范工作,要求抓好旅游安全
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电