组提交:
优点:每条SQL刷写一次磁盘肯定是非常影响效率的,所以MySQL引入了组提交的概念,用时间和数量来控制,让一次提交尽可能多附带一些数据进行提交。从而达到少量的刷写磁盘的效果。对于脏数据及数据不一致问题,InnoDB登引擎都实现了,如果要查询或修改数据,会优先查询缓存。
缺点:如果100个事务才刷写一次磁盘,如果99个事务的时候,重启,断网,断电了,数据将会丢失。
双1操作:
sync_binlog=0,表示每次提交事务都只write,不fsync(刷写磁盘)
sync_binlog=1,表示每次提交事务都fsync(刷写磁盘)
sync_binlog=N,表示每次提交事务都write,但积累N个事务后才fsync(刷写磁盘)
不建议设置为0
innodb_flush_log_at_trx_commit:每一次事务提交是否把日志写入磁盘
0:写入到应用分配内存,一秒钟刷写一次
1:每次事务刷写一次
2:写入到os(系统)内存(缓存),一秒钟刷写一次
建议设置为2,这样可以保证,服务挂了,服务(应用)内存被回收,也可以在重启后从系统缓存中恢复。
二阶段提交:
二阶段提交图解:
在Mysql中的二阶段提交:
说到Mysql中的二阶段提交,就不能不提2个日志文件:
redolog:InnoDB引擎中,为了防止断电,在事务操作过程中,无论提交与否,都会进行记录,好用来恢复。
binlog:Mysql中,用来备份SQL语句的,只有在事务提交后,才会记录,
为了保证数据的一致性。采用二阶段提交协议:
redolog中有记录处于prepare阶段,但binlog中没有记录,表示事务未提交
redolog中有记录处于prepare阶段,binlog中有记录,表示事务需要重新恢复,因为binlog已记录,如果开启主从备份,从库很可能已经备份,所以需要主库中重新commit事务,并将redolog修改为commit阶段。
ps: 而恰巧二阶段提交也是咱们分布式事务中的核心思想。