doc-exports/docs/dws/dev/dws_06_0263.html
Lu, Huayi e6fa411af0 DWS DEV 830.201 version
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com>
Co-authored-by: Lu, Huayi <luhuayi@huawei.com>
Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
2024-05-16 07:24:04 +00:00

62 lines
8.9 KiB
HTML

<a name="EN-US_TOPIC_0000001188589000"></a><a name="EN-US_TOPIC_0000001188589000"></a>
<h1 class="topictitle1">SAVEPOINT</h1>
<div id="body1494377960801"><div class="section" id="EN-US_TOPIC_0000001188589000__s5f5c7196b45748249cab9239de80ef32"><h4 class="sectiontitle">Function</h4><p id="EN-US_TOPIC_0000001188589000__en-us_topic_0059777880_p88037451270"><strong id="EN-US_TOPIC_0000001188589000__b842352706181620">SAVEPOINT</strong> establishes a new savepoint within the current transaction.</p>
<p id="EN-US_TOPIC_0000001188589000__ac0439bb7fd564a90a9bbe12ade2f4cbc">A savepoint is a special mark inside a transaction that rolls back all commands that are executed after the savepoint was established, restoring the transaction state to what it was at the time of the savepoint.</p>
</div>
<div class="section" id="EN-US_TOPIC_0000001188589000__se3e51029d8094b96bf845390e3a07e07"><h4 class="sectiontitle">Precautions</h4><ul id="EN-US_TOPIC_0000001188589000__ul5749173618471"><li id="EN-US_TOPIC_0000001188589000__li2749133654710">Use <strong id="EN-US_TOPIC_0000001188589000__b842352706181729">ROLLBACK TO SAVEPOINT</strong> to roll back to a savepoint. Use <strong id="EN-US_TOPIC_0000001188589000__b531098911076">RELEASE SAVEPOINT</strong> to destroy a savepoint but keep the effects of the commands executed after the savepoint was established.</li><li id="EN-US_TOPIC_0000001188589000__li1274919368471">Savepoints can only be established when inside a transaction block. There can be multiple savepoints defined within a transaction.</li><li id="EN-US_TOPIC_0000001188589000__li157499367478"><strong id="EN-US_TOPIC_0000001188589000__b155359423492612">SAVEPOINT</strong> cannot be used for functions, anonymous blocks, or stored procedures.</li><li id="EN-US_TOPIC_0000001188589000__li2750336114713">In the case of an unexpected termination of a distributed thread or process caused by a node or connection failure, or of an error caused by the inconsistency between source and destination table structures in a COPY FROM operation, the transaction cannot be rolled back to the established savepoint. Instead, the entire transaction will be rolled back.</li><li id="EN-US_TOPIC_0000001188589000__li0750736124710">According to the SQL standard, a savepoint is destroyed automatically when another savepoint with the same name is established. In <span id="EN-US_TOPIC_0000001188589000__text1327428531">GaussDB(DWS)</span>, old savepoints are kept, though only the most recent one will be used for rollback or release. Releasing the newer savepoint with <strong id="EN-US_TOPIC_0000001188589000__b168816306011">RELEASE SAVEPOINT</strong> will cause the older one to again become accessible to <strong id="EN-US_TOPIC_0000001188589000__b155761849007">ROLLBACK TO SAVEPOINT</strong> and <strong id="EN-US_TOPIC_0000001188589000__b15884145211019">RELEASE SAVEPOINT</strong>. Except for this, <strong id="EN-US_TOPIC_0000001188589000__b648910206119">SAVEPOINT</strong> is fully SQL conforming.</li></ul>
</div>
<div class="section" id="EN-US_TOPIC_0000001188589000__s4ba8540aea0146f48402dcc21a3b7573"><h4 class="sectiontitle">Syntax</h4><div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188589000__sa64fa27ae6d9447793dd43c8b06dfc8d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">SAVEPOINT</span><span class="w"> </span><span class="n">savepoint_name</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
</div>
<div class="section" id="EN-US_TOPIC_0000001188589000__s7e9cadffbdb74a7c870d4da59e9e9fac"><h4 class="sectiontitle">Parameter Description</h4><p id="EN-US_TOPIC_0000001188589000__ade421a818a75405fb502b5928bad4623">savepoint_name</p>
<p id="EN-US_TOPIC_0000001188589000__ae62445f119d7420c820a9a26be199569">Specifies the name of a new savepoint.</p>
</div>
<div class="section" id="EN-US_TOPIC_0000001188589000__section239131282517"><h4 class="sectiontitle">Examples</h4><ul id="EN-US_TOPIC_0000001188589000__ul8809124292910"><li id="EN-US_TOPIC_0000001188589000__li11809042152916">Create a savepoint and undo all commands executed after the savepoint is created:<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188589000__screen1997114136268"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">START</span><span class="w"> </span><span class="k">TRANSACTION</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="n">b</span><span class="w"> </span><span class="nb">int</span><span class="p">);</span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">SAVEPOINT</span><span class="w"> </span><span class="n">my_savepoint</span><span class="p">;</span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="k">ROLLBACK</span><span class="w"> </span><span class="k">TO</span><span class="w"> </span><span class="n">SAVEPOINT</span><span class="w"> </span><span class="n">my_savepoint</span><span class="p">;</span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="k">COMMIT</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188589000__p5308848112919">Query the table content, which should contain 1 and 3 but not 2, because 2 has been rolled back.</p>
</li><li id="EN-US_TOPIC_0000001188589000__li1681014242911">Create and then destroy a savepoint.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188589000__screen173929124250"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">START</span><span class="w"> </span><span class="k">TRANSACTION</span><span class="p">;</span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="n">SAVEPOINT</span><span class="w"> </span><span class="n">my_savepoint</span><span class="p">;</span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">table1</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
<span class="n">RELEASE</span><span class="w"> </span><span class="n">SAVEPOINT</span><span class="w"> </span><span class="n">my_savepoint</span><span class="p">;</span>
<span class="k">COMMIT</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188589000__p1441918535297">Query the table content, which should contain both 3 and 4.</p>
</li></ul>
</div>
<div class="section" id="EN-US_TOPIC_0000001188589000__sa449b160d1e74b0980a8dd4f4b8ace35"><h4 class="sectiontitle">Helpful Links</h4><p id="EN-US_TOPIC_0000001188589000__ad35cb4e466554a77ae1fe7d6f0758f5f"><a href="dws_06_0267.html">RELEASE SAVEPOINT</a>, <a href="dws_06_0269.html">ROLLBACK TO SAVEPOINT</a></p>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0254.html">TCL Syntax</a></div>
</div>
</div>