外观
Mysql 中的二阶段提交是什么?解决了什么问题?
MySQL
事务的二阶段提交是指在 MySQL
中,为了确保 redo log
和 binlog
之间的一致性所使用的一种机制。MySQL
通过二阶段提交来保证数据库在崩溃恢复时,不会出现数据丢死或数据不一致的情况。
二阶段提交分为两个阶段:
阶段一:准备阶段(Prepare Phase
)
redo log
记录:MySQL
将事务的变更操作记录到redo log
中,并将redo log
标记为 “prepared
” 状态。这一步确保了即使在后续过程中发生崩溃,也可以通过redo log
恢复事务执行到准备阶段的状态。binlog
写入:将对应的SQL
语句写入binlog
,但此时binlog
并未立即落盘。
阶段二:提交阶段(Commit Phase
)
binlog
刷盘:如果事务中的所有操作都成功执行,MySQL
会将binlog
刷入磁盘,确保binlog
记录了完整的事务操作。redo log
更新:在确认binlog
写入成功后,将redo log
的状态更新为 “committed
”。此时,事务正式提交,数据对其他事务可见。- 回滚操作:如果在准备阶段或
binlog
写入过程中出现错误,协调者会向存储引擎发送 “回滚” 指令,存储引擎会将事务状态标记为 “已回滚(Rolled Back
)”,并撤销事务的所有变更。
MySQL
使用两阶段提交主要是为了保证 redo log
和 binlog
之间的一致性,确保在数据库发生异常重启或主从切换时,数据能够保持一致,避免出现数据丢失或不一致的情况。