异步提交(Asynchronous Commit)是一个允许事务以更高速度完成提交的配置选项,其微小的代价是若数据库服务器在此刻遭遇突然掉电断电,最近数毫秒内提交的极少量事务可能会发生丢失。在许多对吞吐量要求极高的业务场景中,这属于完全可以接受的性能权衡。
在默认的同步提交模式下,服务端在将事务生成的全部 WAL 记录强制刷盘(fsync)之前,不会向客户端返回成功应答,确保应答成功时数据已具备绝对的持久性。然而对于高频短小事务,等待磁盘 fsync 同步的时延占据了整个事务耗时的大半。开启异步提交后,一旦事务逻辑执行完毕,服务端立即可向客户端返回成功确认,而把底层 WAL 的物理刷盘工作委托给后台线程异步延时完成,从而成倍释放数据库的并发吞吐能力。
异步提交引入的风险是微量最近数据的丢失风险,但绝非数据损坏风险。如果系统崩溃,重启恢复时依然能够通过回放已落盘的完整 WAL 记录,将数据库还原到绝对自洽一致的健康状态。
用户可以自由针对每个事务单独指定提交模式。该行为受会话级参数 synchronous_commit 控制。在同一集群内,允许对核心账务交易开启同步提交,而对日志采集等操作开启异步提交。