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

[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 # 保持事务顺序
http://www.xdnf.cn/news/3794.html

相关文章:

  • JVM happens-before 原则有哪些?
  • 利用KMP找出模式串在目标串中所有匹配位置的起始下标
  • 【25软考网工】第五章(4)ARP和RARP
  • 【Touching China】2007-2011
  • Go语言--语法基础4--基本数据类型--类型转换
  • MPI,Pthreads和OpenMP等并行实验环境配置
  • 【第三十四周】多模态大模型调研
  • Uni-app 组件使用
  • 什么是Linux中的systemd?
  • leetcode 59. 螺旋矩阵 II
  • 小土堆pytorch--tensorboard的使用
  • 【c++深入系列】:万字详解vector(附模拟实现的vector源码)
  • Spring MVC的工作流程, DispatcherServlet 的工作流程
  • 25.1linux中外置RTC芯片的PCF8563实验(知识)_csdn
  • 嵌入式GPIO 实验(流水灯程序,八段数码管显示程序)
  • Kubernetes 安装 kubectl
  • Qt实现 hello world + 内存泄漏(5)
  • C++学习:六个月从基础到就业——C++11/14:lambda表达式
  • MATLAB实现二氧化硅和硅光纤的单模光波特性与仿真
  • 打印Excel表格时单元格文字内容被下一行遮盖的解决方法
  • CPU 的指令集存放在什么地方?
  • 深度解析ZFNet:微调优化与可视化创新
  • 【现代深度学习技术】现代循环神经网络06:编码器-解码器架构
  • WPF中Behaviors
  • JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
  • Python速成系列二
  • 多段线和二维多段线的区别及顶点遍历
  • Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
  • OpenHarmony平台驱动开发(一),ADC
  • 大模型实践:图文解锁Ollama在个人笔记本上部署llm