debezium 的源代码中有一条神秘的注释,它说 LSN 不需要在 WAL 文件中排序。这怎么可能?如果 LSN 表示 WAL 中的字节偏移量,怎么能不排序呢?在我们讨论的时候,有人可以准确地解释 XLOG 记录是如何在并发事务期间写入的吗?例如,tx1 提交,并且 tx1 的 XLOG 记录正在写入 WAL。现在 tx2 提交,因此 tx2 的 XLOG 记录将与 tx1 的 XLOG 记录混合。例如,以下顺序是否可行?
tx1_begin, tx2_begin, tx1_xlog1, tx2_xlog1, tx1_commit, tx2_commit
是的,你引用的评论很神秘。您的评估是正确的——LSN 只是 WAL 中的一个位置。
来自不同事务的 XLOG 记录可以自由混合;它们在发生时被记录下来。WAL 不是在提交时写入,而是在数据修改语句发生时写入。在提交时写入的唯一 WAL 记录是一条
COMMIT
记录,并且 WAL 被刷新到磁盘。在恢复期间,每个 WAL 条目都会立即重播。在 PostgreSQL 中没有真正的回滚:如果一个事务被中止,该信息将保留在提交日志中,并且该事务添加的数据变得不可见。