<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>锁 on 张同的博客</title><link>https://www.zhangblogs.cn/tags/%E9%94%81/</link><description>Recent content in 锁 on 张同的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 05 Aug 2024 11:36:03 +0800</lastBuildDate><atom:link href="https://www.zhangblogs.cn/tags/%E9%94%81/index.xml" rel="self" type="application/rss+xml"/><item><title>Postgresql MVCC -2 锁</title><link>https://www.zhangblogs.cn/archives/1722588159084/</link><pubDate>Mon, 05 Aug 2024 11:36:03 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1722588159084/</guid><description>&lt;img src="https://www.zhangblogs.cn/upload/DALL·E%202024-08-05%2011.25.01%20-%20A%20detailed%20diagram%20illustrating%20PostgreSQL%20locks.%20The%20diagram%20should%20include%20different%20types%20of%20locks%20such%20as%20row-level%20locks,%20table-level%20locks,%20and%20-1722828322094-2.webp" style="display: inline-block" /&gt;
&lt;h2&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Postgresql MVCC -2 锁&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;了解完postgresql中的事务隔离级别，剩下的就是锁机制了。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;显式锁 Explicit Locking&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;PostgreSQL提供了多种锁模式来控制对表中数据的并发访问。在MVCC未提供所需行为的情况下，这些模式可用于应用程序控制的锁定。此外，大多数PostgreSQL命令会自动获取适当模式的锁，以确保在命令执行时不会以不兼容的方式删除或修改引用的表。 （例如， &lt;/span&gt;&lt;code&gt;TRUNCATE&lt;/code&gt;&lt;span fontsize="" color=""&gt;不能安全地与同一表上的其他操作同时执行，因此它会在表上获取&lt;/span&gt;&lt;code&gt;ACCESS EXCLUSIVE&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁来强制执行。）&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Table-Level Locks&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ACCESS SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt; (&lt;/span&gt;&lt;code&gt;AccessShareLock&lt;/code&gt;&lt;span fontsize="" color=""&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令在引用的表上获取此模式的锁。一般来说，任何只&lt;/span&gt;&lt;em&gt;&lt;span fontsize="" color=""&gt;读取&lt;/span&gt;&lt;/em&gt;&lt;span fontsize="" color=""&gt;表而不修改表的查询都会获取这种锁模式。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ROW SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt; (&lt;/span&gt;&lt;code&gt;RowShareLock&lt;/code&gt;&lt;span fontsize="" color=""&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令在指定了&lt;/span&gt;&lt;code&gt;FOR UPDATE&lt;/code&gt;&lt;span fontsize="" color=""&gt; 、 &lt;/span&gt;&lt;code&gt;FOR NO KEY UPDATE&lt;/code&gt;&lt;span fontsize="" color=""&gt; 、 &lt;/span&gt;&lt;code&gt;FOR SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;或&lt;/span&gt;&lt;code&gt;FOR KEY SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;选项之一的所有表上获取此模式的锁（除了在没有引用的任何其他表上的&lt;/span&gt;&lt;code&gt;ACCESS SHARE&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁之外）任何显式的&lt;/span&gt;&lt;code&gt;FOR ...&lt;/code&gt;&lt;span fontsize="" color=""&gt;锁定选项）。&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span fontsize="" color=""&gt;注意，虽然名字中含有row，但是这类锁不是还是表锁，不是行锁&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关于select for 锁定子句&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FOR UPDATE&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;锁定选定的行以进行更新。这些行不能被其他事务修改，直到当前事务完成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 这里，你可以对结果集中的行进行更新操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FOR NO KEY UPDATE&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>