<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Redo on Hellokitty&#39;s Blog</title>
    <link>https://yangyang233333.github.io/tags/redo/</link>
    <description>Recent content in Redo on Hellokitty&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 14 Aug 2026 10:00:00 +0800</lastBuildDate>
    <atom:link href="https://yangyang233333.github.io/tags/redo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>FoundationDB 中有 Undo 和 Redo 吗？从 TLog、MVCC 到故障恢复</title>
      <link>https://yangyang233333.github.io/posts/foundationdb-undo-redo/</link>
      <pubDate>Fri, 14 Aug 2026 10:00:00 +0800</pubDate>
      <guid>https://yangyang233333.github.io/posts/foundationdb-undo-redo/</guid>
      <description>&lt;p&gt;传统数据库通过 Undo Log 和 Redo Log 保证事务的原子性与持久性：Undo 撤销未提交的修改，Redo 恢复已经提交但尚未写入数据文件的修改。那么，在采用分布式事务架构的 FoundationDB 中，是否也存在这两类日志？&lt;/p&gt;
&lt;p&gt;简短回答是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FoundationDB 有承担类似 Redo 职责的 TLog，但通常没有传统意义上的 Undo Log。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这并不意味着 FoundationDB 不支持事务回滚或 MVCC，而是因为它对未提交数据、提交日志和历史版本的组织方式与传统数据库不同。&lt;/p&gt;
&lt;h2 id=&#34;一先回顾传统数据库为什么需要-undo-和-redo&#34;&gt;一、先回顾传统数据库为什么需要 Undo 和 Redo&lt;/h2&gt;
&lt;p&gt;传统数据库通常允许事务直接修改缓冲池中的共享数据页。数据页何时写入磁盘，与事务何时提交并不完全同步。&lt;/p&gt;
&lt;p&gt;因此会出现两种状态。&lt;/p&gt;
&lt;h3 id=&#34;1-事务未提交数据页却已经落盘&#34;&gt;1. 事务未提交，数据页却已经落盘&lt;/h3&gt;
&lt;p&gt;例如事务把账户余额从 &lt;code&gt;100&lt;/code&gt; 改成 &lt;code&gt;80&lt;/code&gt;，但随后事务失败：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;UPDATE&lt;/span&gt; account
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; balance &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ROLLBACK&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果包含 &lt;code&gt;80&lt;/code&gt; 的脏页已经写入磁盘，数据库就必须知道原值是 &lt;code&gt;100&lt;/code&gt;，才能撤销这次修改。这是 Undo Log 的主要职责。&lt;/p&gt;
&lt;h3 id=&#34;2-事务已经提交数据页却尚未落盘&#34;&gt;2. 事务已经提交，数据页却尚未落盘&lt;/h3&gt;
&lt;p&gt;另一个事务已经执行 &lt;code&gt;COMMIT&lt;/code&gt;，但修改可能仍然只存在于内存中的脏页里。如果服务器此时断电，已提交的数据就会丢失。&lt;/p&gt;
&lt;p&gt;因此数据库先持久化 Redo Log，再返回提交成功。重启后，即使数据页没有及时落盘，也可以通过 Redo 重新应用修改。&lt;/p&gt;
&lt;p&gt;可以把二者概括为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Undo：事务不应该生效，但修改可能已经进入数据文件。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Redo：事务应该生效，但修改可能还没有进入数据文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;二foundationdb-的事务提交流程&#34;&gt;二、FoundationDB 的事务提交流程&lt;/h2&gt;
&lt;p&gt;FoundationDB 并不是把客户端事务中的每次 &lt;code&gt;set&lt;/code&gt; 或 &lt;code&gt;clear&lt;/code&gt; 立即写入 Storage Server。事务提交前，这些操作首先保存在客户端的事务对象中。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
