<?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>事务 on Kernel Notes</title><link>https://my-blog.j8465383071.workers.dev/tags/%E4%BA%8B%E5%8A%A1/</link><description>Recent content in 事务 on Kernel Notes</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><lastBuildDate>Mon, 17 Aug 2026 18:36:57 +0800</lastBuildDate><atom:link href="https://my-blog.j8465383071.workers.dev/tags/%E4%BA%8B%E5%8A%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgreSQL 3-2 Transation (v2)</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-tans-ai/</link><pubDate>Fri, 03 Jul 2026 16:51:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-tans-ai/</guid><description>&lt;h1 id="概述">概述&lt;/h1>
&lt;p>假如，2个会话，并发写入数据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data1&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">BEGIN&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">INSERT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">INTO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">VALUES&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;data2&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">COMMIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>加锁逻辑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">exec_simple_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_parse_query&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_analyze_and_rewrite&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pg_plan_queries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PortalRunMulti&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ProcessQuery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorStart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">InitPlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitModifyTable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInitResultRelation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecGetRangeTableRelation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relation&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;RowExclusiveLock&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 8级锁，行级排他锁&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relation_open&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockRelationOid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockAcquire&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">standard_ExecutorRun&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecutePlan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ExecInsert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">table_tuple_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heapam_tuple_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">heap_insert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationGetBufferForTuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LockBuffer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LWLockAcquire&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;LW_EXCLUSIVE&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 读写锁&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RelationPutHeapTuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log_heap_insert&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>锁&lt;/p>
&lt;/li>
&lt;li>
&lt;p>HWLock&lt;/p>
&lt;ul>
&lt;li>8级&lt;/li>
&lt;li>relation, index, buffer&lt;/li>
&lt;li>死锁检测&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h2 id="lwlocks">LWLocks&lt;/h2>
&lt;ul>
&lt;li>buffer&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>SpinLock&lt;/p>
&lt;/li>
&lt;li>
&lt;p>PresicateLock&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="hwlock">HWLock&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>锁&lt;/th>
&lt;th>取值&lt;/th>
&lt;th>操作&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>AccessShareLock&lt;/td>
&lt;td>1&lt;/td>
&lt;td>SELECT&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RowShareLock&lt;/td>
&lt;td>2&lt;/td>
&lt;td>SELECT FOR UPDATE/SHARE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RowExclusiveLock&lt;/td>
&lt;td>3&lt;/td>
&lt;td>INSERT/UPDATE/DELETE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareUpdateExclusiveLock&lt;/td>
&lt;td>4&lt;/td>
&lt;td>VACUUM/ANALYZE/CRATE INDEX CONCURRENTLY&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareLock&lt;/td>
&lt;td>5&lt;/td>
&lt;td>CREATE INDEX&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ShareRowExclusiveLock&lt;/td>
&lt;td>6&lt;/td>
&lt;td>row share&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ExclusiveLock&lt;/td>
&lt;td>7&lt;/td>
&lt;td>block ROW SHARE/SELECT FOR UPDATE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AccessExclusiveLock&lt;/td>
&lt;td>8&lt;/td>
&lt;td>ALTER TABLE/DROP TABLE/VACUUM FULL&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">LockRelationOid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LockAcquireExtended
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hash_search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所有进程共享&lt;/p></description></item><item><title>PostgreSQL 3-2 Transation</title><link>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-transaction/</link><pubDate>Tue, 21 Jan 2025 13:55:00 +0800</pubDate><guid>https://my-blog.j8465383071.workers.dev/posts/postgresql/3-6-transaction/</guid><description>&lt;h1 id="1-事务的概念">1 事务的概念&lt;/h1>
&lt;h2 id="11-事务的基本特性">1.1 事务的基本特性&lt;/h2>
&lt;p>事务的4个特性：&lt;/p>
&lt;ul>
&lt;li>原子性 Automicity&lt;/li>
&lt;li>一致性 Consistency&lt;/li>
&lt;li>隔离性 Isolation&lt;/li>
&lt;li>持久性 Durability&lt;/li>
&lt;/ul>
&lt;h2 id="12-事务的隔离性">1.2 事务的隔离性&lt;/h2>
&lt;p>不同隔离级别下，可能出现的异常如下：（T 表示可能）&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>异常&lt;/th>
&lt;th>读未提交&lt;/th>
&lt;th>读已提交&lt;/th>
&lt;th>可重复读&lt;/th>
&lt;th>可串行化&lt;/th>
&lt;th>解释&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>脏读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>读其他事务未提交数据&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>不可重复读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>.&lt;/td>
&lt;td>2次读取数据不一致&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>幻读&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>T&lt;/td>
&lt;td>.&lt;/td>
&lt;td>2次读取数据条数不一致&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>postgresql默认的隔离级别是读已提交&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 查看默认事务隔离级别
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">show&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">default_transaction_isolation&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">default_transaction_isolation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">read&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">committed&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查询当前的事务快照 pg 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">txid_current_snapshot&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">txid_current_snapshot&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-----------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1081&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">1081&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- 查询所有正在活跃的进程
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_stat_activity&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">--
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="13-事务的实现">1.3 事务的实现&lt;/h2>
&lt;p>为实现事务，有3种并发控制机制：&lt;/p></description></item></channel></rss>