## 引言 > 不敢说全部,大多数系统原子级的操作,在微观层面都是分布式的。 比如: 1. Mysql中的事务原子性的实现原理; 2. Java内存数据一致性原理。 其实现,从微观层面来讲都需要有更细粒度的组件来保证。 ## Mysql redo log和binlog区别 | | redo log | binlog| | --- | --- | --| | 引擎 | Innodb引擎特有的,用于保证crash-safe能力 |是Mysql的server层实现的,所有引擎都可以使用| | 功能| redo log是物理日志,记录的是在某个数据页上做了什么修改|binlog是逻辑日志,记录的是这个语句的原始逻辑,比如值+1| |特性| redo log是循环写的,空间固定会用完 | binlog是可以追加写入的| Mysql中保证数据的一致性,有两个重要的日志:物理日志redo log和逻辑日志binlog。 redo log用于保证crash-safe能力。 `Innodb_flush_log_at_trx_commit`这个参数设置成1,表示每次失误的redo log都直接持久化到磁盘,可以保证Mysql异常重启后数据不丢失。 sync_binlog这个参数设置成1的时候,表示每次失误的binlog都持久化到磁盘,这样可以保证Mysql异常重启后binlog不丢失。 ![](https://img.kancloud.cn/36/a0/36a0957785c7a0cd8cf97e1e6095f9ee_1212x233.png) ## 两阶段提交 两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案。 比如: - Mysql通过redo log、binlog实现数据一致性。 - 分布式事务2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者都预留资源成功,则进行第二阶段的资源提交,否则事务协调者回滚资源。