carsh-safe保证mysql在重启或者宕机提交的数据不会丢失,未提交的数据不会回滚。
实现原理:
1、查询sql数据,如果不在内存则加载到内存,在内存中执行更新操作,2、把旧数据放入undo log日志中,3、将数据页的更新记录到redo log buffer中状态为perpare,4、然后更新逻辑操作到biglog cache中,5、最后在将redo log设置成commit状态,6、返回成功。
缺点:多个事务执行的时候binlog commit顺序不一致容易导致主从不一致。早期mysql采用prepare_commit_mutex锁来保证多事务提交顺序,一个事务获取到锁,状态才可以为prepare,一直到commit,锁资源才会释放。下个事务才可以获取到锁,来进行prepare操作。缺点 竞争锁资源,消耗性能,每次二阶段提交需要和磁盘异步交互2次,一次redo log 第二次binlog.
为什么不会丢失?
1、写入内存完,还没有写入redo log 发生宕机,此时这个事务还没有提交。所以崩溃和事务没有关系。
2、写入redo log或redo log写入完成之后宕机,重启后先检查redo log是否完整,binlog是否完整,不完整会回滚。
3、写入binlog中或写完之后丢失,重启后先检查redo log是否完整,binlog是否完整,不完整会回滚,完整则会进行commit操作。
4、commit redo log时崩溃数据还没有返回之前,重启后先检查redo log是否完整,binlog是否完整,完整则返回数据。
组提交:
保证commit和binlog落盘顺序一致,事务分组将刷盘交给另一个事务操作。