什么是两阶段提交?
两阶段提交中的两阶段分别是准备阶段(Prepare)和提交阶段(Commit)。
确保了事务的原子性和统一性。
为什么要两阶段提交?
保证Redo log和binlog的逻辑一致性!!!
如果没有两阶段提交,当我们开个事务,来执行更新操作。
- 当Redo log刷入到磁盘后,mysql宕机,Binlog没有来得及刷入到磁盘。
mysql重启后:根据Redo log来执行刚才的更新操作。此时该数据库的值就是最新的。
在主从结构中,从数据库根据Binlog日志,来更新从数据库,因为Binlog没有来得及刷入磁盘,导致数据是旧的,现在就会导致从库和主库数据不一致。
- 当Binlog刷入到磁盘后,mysql宕机,Redo log没有来得及输入到磁盘。
mysql重启后:根据Redo log来看,没有更新操作进行,所以此时数据库还是旧值。
在主从结构中,从数据库根据Binlog日志,来更新从数据库,因为Binlog已经记录了更新信息,所以从库可以将信息更新为最新的,现在就导致了主从数据库不一致。
由此可见,只有保持redo log 和 binlog一致,才能保持主从数据一致。
那么如何才能保证两个日志逻辑一致?那就需要使用 两阶段提交 来解决了。