Postgresql
postgres WAL 文件中 LSN 的排序
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 中沒有真正的回滾:如果一個事務被中止,該資訊將保留在送出日誌中,並且該事務添加的數據變得不可見。