MySQL事务的三种提交策略

787 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

上篇文章讲述了MySQL事务如何使用redo log日志来保证数据的持久性,那么今天这篇文章来聊聊MySQL事务的三种提交策略,查看当前数据库事务提交策略:show variables like 'innodb_flush_log_at_trx_commit'

1.innodb_flush_log_at_trx_commit 等于1

MySQL事务提交策略默认等于1,他表示每次事务提交都会先将数据记录到redo log日志文件中,这种方式保证了数据真正的持久性,大致的流程图我画了一下,如下图:

image.png

可以看到不是将数据直接刷入磁盘中的redo log日志文件中间还会使用到redo log buffer缓冲池和OS cache系统缓存,所以是强制将redo log buffer中的数据刷入系统缓存在调用系统缓存同步到磁盘当中。

2.innodb_flush_log_at_trx_commit 等于2

当innodb_flush_log_at_trx_commit=2时,在提交事务时会先将redo log buffer中的数据同步的OS cache缓存当中至于系统缓存什么时候同步到磁盘上的redo log日志文件上由操作系统来决定,比如说当OS cache内存达到了阈值就会去主动刷或者每秒刷,这样子即使MySQL服务宕机事务提交也不会造成数据丢失,因为OS cache同步数据redo log日志文件后MySQL服务重启会根据redo log重做日志恢复数据,但是如果是操作系统,比如说我们的服务器挂了,那就回丢失本次提交OS cache的数据,但是服务器宕机还是很少见,大致流程图如下:

image.png

3.innodb_flush_log_at_trx_commit 等于0

当innodb_flush_log_at_trx_commit=2时,在提交事务的时候不会去操作,会交给MySQL一个后台线程去将redo log buffer中的数据同步到OS cache中,然后调用操作系统方法同步,但是当MySQL服务或者操作系统宕机都会丢失redo log buffer中的数据,安全性极差但是效率最快。

总结

  1. innodb_flush_log_at_trx_commit 等于1 :MySQL默认的事务提交策略,安全性最高能够保证真正意义上的数据持久化保证数据不丢失,但是效率最低(推荐使用)。

  2. innodb_flush_log_at_trx_commit 等于2 :安全性较高,效率快(和策略为0差不多的速度)。

  3. innodb_flush_log_at_trx_commit 等于0 :安全性最低,但是效率最高,但是不推荐使用