既然涉及到事务提交,那么我们就是以InnoDB
来说明的。
MySQL有一个参数,能够控制事务提交时,刷redo log的策略。该参数为:innodb_flush_log_at_trx_commit
。
set global innodb_flush_log_at_trx_commit = 0
该方式可以获得最佳性能。
每隔1秒种,才将Log Buffer中的数据批量写入OS Cache,同时MySQL主动fsync。
这种策略,如果数据库崩溃,会有1秒的数据丢失。
set global innodb_flush_log_at_trx_commit = 1
该方式可以获得强一致性。
每次事务提交,都将Log Buffer中数据写入到OS Cache,同时MySQL主动fsync。
这种策略是InnoDB默认配置,是为了保证事务ACID特性。
set global innodb_flush_log_at_trx_commit = 2
该方式则是一种trade-off的结果。
每次事务提交,都将Log Buffer中的数据写入OS Cache;
每隔1秒,MySQL主动将OS Cache中数据批量fsync。
这种策略,如果操作系统崩溃,最多会有1秒的数据丢失。(磁盘IO次数是不确定的,因为OS的fsync的频率并不是MySQL能控制的;OS也会进行fsync,而MySQL主动fsync的周期是1秒,所以最多丢1秒数据)