跳至主要內容

什么是事务的两阶段提交?

fangzhipeng约 1164 字大约 4 分钟

什么是事务的两阶段提交

事务的两阶段提交(Two-Phase Commit,2PC)是一种分布式事务处理协议,用于确保分布式系统中的多个参与者(通常是不同的数据库或者资源管理器)在执行事务时能够保持一致性。

两阶段提交协议分为两个阶段:

  1. 准备阶段(Prepare Phase): 在这个阶段,事务的协调者(Coordinator)向所有参与者发送准备请求,并等待参与者的回复。参与者在收到准备请求后,会执行事务的预提交操作,并将执行结果(准备就绪或者失败)返回给协调者。如果所有参与者都成功地完成了预提交操作,那么协调者会进入下一个阶段;否则,协调者会向所有参与者发送回滚请求,取消事务。

  2. 提交阶段(Commit Phase): 在这个阶段,如果所有参与者都准备就绪,协调者会向所有参与者发送提交请求,并等待参与者的确认。参与者在收到提交请求后,会执行事务的最终提交操作,并将执行结果返回给协调者。如果所有参与者都成功地提交了事务,那么协调者会向所有参与者发送提交完成的通知;否则,协调者会向所有参与者发送回滚请求,取消事务。

两阶段提交协议的优点是能够保证在分布式环境下所有参与者的一致性,即使出现故障也可以通过事务的回滚操作来保证数据的一致性。然而,两阶段提交协议也存在一些缺点,例如需要等待所有参与者的响应,可能会引入单点故障,并且在网络分区等异常情况下可能会导致阻塞。因此,在实际应用中,需要根据具体场景权衡使用两阶段提交协议的利弊。

什么是Mysql的事务两阶段提交

MySQL 中事务两阶段提交的流程如下图所示:

image-20240317212626312
image-20240317212626312

在两阶段提交中:

  • 第一阶段是准备阶段(Prepare Phase),在这个阶段 MySQL 将事务的修改操作记录到 Redo Log 中,并将其标记为准备状态(Prepare)。在这个过程中,MySQL 确保了事务的原子性和持久性。紧接着,MySQL 写入 Binlog,这是用于数据库的逻辑日志,记录了事务的逻辑操作。
  • 第二阶段是提交阶段(Commit Phase),在这个阶段 MySQL 将 Binlog 记录标记为提交状态(Commit),并确保事务的修改持久化到数据库中。这个过程确保了事务的一致性和持久性。

由此可见MySQL在准备事务的时候,把写redolog、binlog分成两个阶段。

两阶段写日志有什么作用?

MySQL 的 Binlog(二进制日志)和 Redo Log(重做日志)在数据库的数据恢复和备份、主从复制等方面发挥着重要作用。如果不需要这些功能,确实可以选择关闭 Binlog,只依赖 Redo Log 来保证数据库的数据一致性和持久性。

Redo Log 是 InnoDB 存储引擎的事务日志,记录了每个事务对数据库所做的修改操作。Redo Log 的主要作用是确保数据库在崩溃恢复时可以将内存中的数据恢复到最近的一致状态,从而保证了事务的原子性和持久性。只有 Redo Log 已经持久化到磁盘,数据库才能确保数据的一致性。

Binlog 则是 MySQL 的逻辑日志,记录了数据库的逻辑操作,比如 SQL 语句的执行。Binlog 在数据备份、恢复和主从复制等场景下发挥着重要作用。通过 Binlog,可以实现数据的远程备份、恢复以及主从复制等功能。

两阶段提交的主要目的是确保 Redo Log 和 Binlog 的数据一致性,从而保证数据库在崩溃恢复和主从复制等场景下的可靠性和稳定性。通过两阶段提交机制,可以在事务提交时,先将 Redo Log 标记为准备状态,然后再将 Binlog 记录下来,最终将 Redo Log 标记为提交状态,从而保证 Redo Log 和 Binlog 的逻辑一致性。

方志朋_官方公众号
方志朋_官方公众号