diff options
Diffstat (limited to 'www/lang_transaction.html')
-rw-r--r-- | www/lang_transaction.html | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/www/lang_transaction.html b/www/lang_transaction.html new file mode 100644 index 0000000..956de6c --- /dev/null +++ b/www/lang_transaction.html @@ -0,0 +1,445 @@ +<!DOCTYPE html> +<html><head> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"> +<link href="sqlite.css" rel="stylesheet"> +<title>Transaction</title> +<!-- path= --> +</head> +<body> +<div class=nosearch> +<a href="index.html"> +<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0"> +</a> +<div><!-- IE hack to prevent disappearing logo --></div> +<div class="tagline desktoponly"> +Small. Fast. Reliable.<br>Choose any three. +</div> +<div class="menu mainmenu"> +<ul> +<li><a href="index.html">Home</a> +<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a> +<li class='wideonly'><a href='about.html'>About</a> +<li class='desktoponly'><a href="docs.html">Documentation</a> +<li class='desktoponly'><a href="download.html">Download</a> +<li class='wideonly'><a href='copyright.html'>License</a> +<li class='desktoponly'><a href="support.html">Support</a> +<li class='desktoponly'><a href="prosupport.html">Purchase</a> +<li class='search' id='search_menubutton'> +<a href="javascript:void(0)" onclick='toggle_search()'>Search</a> +</ul> +</div> +<div class="menu submenu" id="submenu"> +<ul> +<li><a href='about.html'>About</a> +<li><a href='docs.html'>Documentation</a> +<li><a href='download.html'>Download</a> +<li><a href='support.html'>Support</a> +<li><a href='prosupport.html'>Purchase</a> +</ul> +</div> +<div class="searchmenu" id="searchmenu"> +<form method="GET" action="search"> +<select name="s" id="searchtype"> +<option value="d">Search Documentation</option> +<option value="c">Search Changelog</option> +</select> +<input type="text" name="q" id="searchbox" value=""> +<input type="submit" value="Go"> +</form> +</div> +</div> +<script> +function toggle_div(nm) { +var w = document.getElementById(nm); +if( w.style.display=="block" ){ +w.style.display = "none"; +}else{ +w.style.display = "block"; +} +} +function toggle_search() { +var w = document.getElementById("searchmenu"); +if( w.style.display=="block" ){ +w.style.display = "none"; +} else { +w.style.display = "block"; +setTimeout(function(){ +document.getElementById("searchbox").focus() +}, 30); +} +} +function div_off(nm){document.getElementById(nm).style.display="none";} +window.onbeforeunload = function(e){div_off("submenu");} +/* Disable the Search feature if we are not operating from CGI, since */ +/* Search is accomplished using CGI and will not work without it. */ +if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){ +document.getElementById("search_menubutton").style.display = "none"; +} +/* Used by the Hide/Show button beside syntax diagrams, to toggle the */ +function hideorshow(btn,obj){ +var x = document.getElementById(obj); +var b = document.getElementById(btn); +if( x.style.display!='none' ){ +x.style.display = 'none'; +b.innerHTML='show'; +}else{ +x.style.display = ''; +b.innerHTML='hide'; +} +return false; +} +var antiRobot = 0; +function antiRobotGo(){ +if( antiRobot!=3 ) return; +antiRobot = 7; +var j = document.getElementById("mtimelink"); +if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href"); +} +function antiRobotDefense(){ +document.body.onmousedown=function(){ +antiRobot |= 2; +antiRobotGo(); +document.body.onmousedown=null; +} +document.body.onmousemove=function(){ +antiRobot |= 2; +antiRobotGo(); +document.body.onmousemove=null; +} +setTimeout(function(){ +antiRobot |= 1; +antiRobotGo(); +}, 100) +antiRobotGo(); +} +antiRobotDefense(); +</script> +<div class=fancy> +<div class=nosearch> +<div class="fancy_title"> +Transaction +</div> +</div> + + + + +<h1 id="transaction_control_syntax"><span>1. </span>Transaction Control Syntax</h1> + +<p><b><a href="syntax/begin-stmt.html">begin-stmt:</a></b> +<button id='x2131' onclick='hideorshow("x2131","x2132")'>hide</button></p> + <div id='x2132' class='imgcontainer'> + <div style="max-width:560px"><svg xmlns='http://www.w3.org/2000/svg' class="pikchr" viewBox="0 0 560.669 140.4"> +<circle cx="5" cy="17" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="32,17 20,21 20,12" style="fill:rgb(0,0,0)"/> +<path d="M9,17L26,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M47,32L86,32A15 15 0 0 0 101 17A15 15 0 0 0 86 2L47,2A15 15 0 0 0 32 17A15 15 0 0 0 47 32Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="66" y="17" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">BEGIN</text> +<polygon points="124,17 112,21 112,12" style="fill:rgb(0,0,0)"/> +<path d="M101,17L118,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="162,123 150,127 150,118" style="fill:rgb(0,0,0)"/> +<path d="M124,17 L 131,17 Q 139,17 139,32 L 139,108 Q 139,123 147,123 L 156,123" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M177,138L261,138A15 15 0 0 0 276 123A15 15 0 0 0 261 108L177,108A15 15 0 0 0 162 123A15 15 0 0 0 177 138Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="219" y="123" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">EXCLUSIVE</text> +<polygon points="299,123 287,127 287,118" style="fill:rgb(0,0,0)"/> +<path d="M276,123L293,123" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="337,17 325,21 325,12" style="fill:rgb(0,0,0)"/> +<path d="M299,123 L 306,123 Q 314,123 314,108 L 314,32 Q 314,17 322,17 L 331,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="373,17 361,21 361,12" style="fill:rgb(0,0,0)"/> +<path d="M337,17L367,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M388,32L500,32A15 15 0 0 0 515 17A15 15 0 0 0 500 2L388,2A15 15 0 0 0 373 17A15 15 0 0 0 388 32Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="444" y="17" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">TRANSACTION</text> +<polygon points="551,17 539,21 539,12" style="fill:rgb(0,0,0)"/> +<path d="M515,17L545,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<circle cx="554" cy="17" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="444,47 432,51 432,43" style="fill:rgb(0,0,0)"/> +<path d="M337,17 L 344,17 Q 352,17 352,32 L 352,32 Q 352,47 367,47 L 423,47 L 438,47" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M444,47 L 511,47 Q 526,47 526,32 L 526,32 Q 526,17 533,17 L 541,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M124,17L325,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="162,47 150,51 150,43" style="fill:rgb(0,0,0)"/> +<path d="M139,32 L 139,39 Q 139,47 147,47 L 156,47" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M177,62L257,62A15 15 0 0 0 272 47L272,47A15 15 0 0 0 257 32L177,32A15 15 0 0 0 162 47L162,47A15 15 0 0 0 177 62Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="217" y="47" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">DEFERRED</text> +<polygon points="295,47 284,51 284,43" style="fill:rgb(0,0,0)"/> +<path d="M272,47L289,47" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M295,47 L 304,47 Q 314,47 314,40 L 314,32" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="162,85 150,89 150,81" style="fill:rgb(0,0,0)"/> +<path d="M139,32 L 139,70 Q 139,85 147,85 L 156,85" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M177,100L265,100A15 15 0 0 0 281 85A15 15 0 0 0 265 70L177,70A15 15 0 0 0 162 85A15 15 0 0 0 177 100Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="221" y="85" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">IMMEDIATE</text> +<polygon points="304,85 292,89 292,81" style="fill:rgb(0,0,0)"/> +<path d="M281,85L298,85" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M304,85 L 309,85 Q 314,85 314,77 L 314,70" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +</svg> +</div> +</div> +<p><b><a href="syntax/commit-stmt.html">commit-stmt:</a></b> +<button id='x2133' onclick='hideorshow("x2133","x2134")'>hide</button></p> + <div id='x2134' class='imgcontainer'> + <div style="max-width:434px"><svg xmlns='http://www.w3.org/2000/svg' class="pikchr" viewBox="0 0 434.506 72.36"> +<circle cx="5" cy="17" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="32,17 20,21 20,12" style="fill:rgb(0,0,0)"/> +<path d="M9,17L26,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="68,17 56,21 56,12" style="fill:rgb(0,0,0)"/> +<path d="M32,17L62,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M83,32L141,32A15 15 0 0 0 157 17A15 15 0 0 0 141 2L83,2A15 15 0 0 0 68 17A15 15 0 0 0 83 32Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="112" y="17" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">COMMIT</text> +<polygon points="202,17 190,21 190,12" style="fill:rgb(0,0,0)"/> +<path d="M157,17L196,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M202,17L238,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M253,32L365,32A15 15 0 0 0 380 17A15 15 0 0 0 365 2L253,2A15 15 0 0 0 238 17A15 15 0 0 0 253 32Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="309" y="17" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">TRANSACTION</text> +<polygon points="425,17 413,21 413,12" style="fill:rgb(0,0,0)"/> +<path d="M380,17L419,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<circle cx="428" cy="17" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M83,70L104,70A15 15 0 0 0 119 55L119,55A15 15 0 0 0 104 39L83,39A15 15 0 0 0 68 55L68,55A15 15 0 0 0 83 70Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="94" y="55" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">END</text> +<polygon points="68,55 56,59 56,50" style="fill:rgb(0,0,0)"/> +<path d="M32,17 L 39,17 Q 47,17 47,32 L 47,40 Q 47,55 55,55 L 62,55" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="157,55 145,59 145,50" style="fill:rgb(0,0,0)"/> +<path d="M119,55L151,55" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M157,55 L 164,55 Q 172,55 172,40 L 172,32 Q 172,17 179,17 L 187,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="309,47 297,51 297,43" style="fill:rgb(0,0,0)"/> +<path d="M202,17 L 209,17 Q 217,17 217,32 L 217,32 Q 217,47 232,47 L 288,47 L 303,47" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M309,47 L 380,47 Q 395,47 395,32 L 395,32 Q 395,17 402,17 L 410,17" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +</svg> +</div> +</div> +<p><b><a href="syntax/rollback-stmt.html">rollback-stmt:</a></b> +<button id='x2135' onclick='hideorshow("x2135","x2136")'>hide</button></p> + <div id='x2136' class='imgcontainer'> + <div style="max-width:801px"><svg xmlns='http://www.w3.org/2000/svg' class="pikchr" viewBox="0 0 801.734 67.392"> +<circle cx="5" cy="33" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="32,33 20,38 20,29" style="fill:rgb(0,0,0)"/> +<path d="M9,33L26,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M47,48L125,48A15 15 0 0 0 140 33A15 15 0 0 0 125 18L47,18A15 15 0 0 0 32 33A15 15 0 0 0 47 48Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="86" y="33" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">ROLLBACK</text> +<polygon points="176,33 164,38 164,29" style="fill:rgb(0,0,0)"/> +<path d="M140,33L170,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M191,48L303,48A15 15 0 0 0 318 33A15 15 0 0 0 303 18L191,18A15 15 0 0 0 176 33A15 15 0 0 0 191 48Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="247" y="33" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">TRANSACTION</text> +<polygon points="390,33 378,38 378,29" style="fill:rgb(0,0,0)"/> +<path d="M318,33L384,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M405,48L411,48A15 15 0 0 0 426 33A15 15 0 0 0 411 18L405,18A15 15 0 0 0 390 33A15 15 0 0 0 405 48Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="408" y="33" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">TO</text> +<polygon points="462,33 450,38 450,29" style="fill:rgb(0,0,0)"/> +<path d="M426,33L456,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M477,48L561,48A15 15 0 0 0 576 33A15 15 0 0 0 561 18L477,18A15 15 0 0 0 462 33A15 15 0 0 0 477 48Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="519" y="33" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">SAVEPOINT</text> +<polygon points="612,33 601,38 601,29" style="fill:rgb(0,0,0)"/> +<path d="M576,33L606,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M627,48L741,48A15 15 0 0 0 756 33A15 15 0 0 0 741 18L627,18A15 15 0 0 0 612 33A15 15 0 0 0 627 48Z" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<text x="684" y="33" text-anchor="middle" fill="rgb(0,0,0)" dominant-baseline="central">savepoint-name</text> +<polygon points="792,33 780,38 780,29" style="fill:rgb(0,0,0)"/> +<path d="M756,33L786,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<circle cx="795" cy="33" r="3.6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="519,6 507,10 507,2" style="fill:rgb(0,0,0)"/> +<path d="M426,33 L 433,33 Q 441,33 441,20 Q 441,6 456,6 L 498,6 L 513,6" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M519,6 L 576,6 Q 591,6 591,20 Q 591,33 599,33 L 606,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="519,60 507,65 507,56" style="fill:rgb(0,0,0)"/> +<path d="M352,33 L 359,33 Q 367,33 367,47 Q 367,60 382,60 L 498,60 L 513,60" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M519,60 L 756,60 Q 771,60 771,47 Q 771,33 778,33 L 786,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<polygon points="247,60 235,65 235,56" style="fill:rgb(0,0,0)"/> +<path d="M140,33 L 147,33 Q 155,33 155,47 Q 155,60 170,60 L 226,60 L 241,60" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +<path d="M247,60 L 318,60 Q 333,60 333,47 Q 333,33 340,33 L 348,33" style="fill:none;stroke-width:2.16;stroke:rgb(0,0,0);" /> +</svg> +</div> +</div> + + +<h1 id="transactions"><span>2. </span>Transactions</h1> + +<p> +No reads or writes occur except within a transaction. +Any command that accesses the database (basically, any SQL command, +except a few <a href="pragma.html#syntax">PRAGMA</a> statements) +will automatically start a transaction if +one is not already in effect. Automatically started transactions +are committed when the last SQL statement finishes. +</p> + +<p> +Transactions can be started manually using the BEGIN +command. Such transactions usually persist until the next +COMMIT or ROLLBACK command. But a transaction will also +ROLLBACK if the database is closed or if an error occurs +and the ROLLBACK conflict resolution algorithm is specified. +See the documentation on the <a href="lang_conflict.html">ON CONFLICT</a> +clause for additional information about the ROLLBACK +conflict resolution algorithm. +</p> + +<p> +END TRANSACTION is an alias for COMMIT. +</p> + +<p> Transactions created using BEGIN...COMMIT do not nest. +For nested transactions, use the <a href="lang_savepoint.html">SAVEPOINT</a> and <a href="lang_savepoint.html">RELEASE</a> commands. +The "TO SAVEPOINT <span class='yyterm'>name</span>" clause of the ROLLBACK command shown +in the syntax diagram above is only applicable to <a href="lang_savepoint.html">SAVEPOINT</a> +transactions. An attempt to invoke the BEGIN command within +a transaction will fail with an error, regardless of whether +the transaction was started by <a href="lang_savepoint.html">SAVEPOINT</a> or a prior BEGIN. +The COMMIT command and the ROLLBACK command without the TO clause +work the same on <a href="lang_savepoint.html">SAVEPOINT</a> transactions as they do with transactions +started by BEGIN.</p> + +<h2 id="read_transactions_versus_write_transactions"><span>2.1. </span>Read transactions versus write transactions</h2> + +<p>SQLite supports multiple simultaneous read transactions +coming from separate database connections, possibly in separate +threads or processes, but only one simultaneous write transaction. +</p><p> + +</p><p>A read transaction is used for reading only. A write transaction +allows both reading and writing. A read transaction is started +by a SELECT statement, and a write transaction is started by +statements like CREATE, DELETE, DROP, INSERT, or UPDATE (collectively +"write statements"). If a write statement occurs while +a read transaction is active, then the read transaction is upgraded +to a write transaction if possible. If some other database connection +has already modified the database or is already in the process of +modifying the database, then upgrading to a write transaction is +not possible and the write statement will fail with <a href="rescode.html#busy">SQLITE_BUSY</a>. +</p> + +<p> +While a read transaction is active, any changes to the database that +are implemented by separate database connections will not be seen +by the database connection that started the read transaction. If database +connection X is holding a read transaction, it is possible that some +other database connection Y might change the content of the database +while X's transaction is still open, however X will not be able to see +those changes until after the transaction ends. While its read +transaction is active, X will continue to see an historic snapshot of +the database prior to the changes implemented by Y. +</p> + + +<a name="immediate"></a> + +<h2 id="deferred_immediate_and_exclusive_transactions"><span>2.2. </span>DEFERRED, IMMEDIATE, and EXCLUSIVE transactions</h2> + +<p> +Transactions can be DEFERRED, IMMEDIATE, or EXCLUSIVE. +The default transaction behavior is DEFERRED. +</p> + +<p> +DEFERRED means that the transaction does not actually +start until the database is first accessed. Internally, +the BEGIN DEFERRED statement merely sets a flag on the database +connection that turns off the automatic commit that would normally +occur when the last statement finishes. This causes the transaction +that is automatically started to persist until an explicit +COMMIT or ROLLBACK or until a rollback is provoked by an error +or an ON CONFLICT ROLLBACK clause. If the first statement after +BEGIN DEFERRED is a SELECT, then a read transaction is started. +Subsequent write statements will upgrade the transaction to a +write transaction if possible, or return SQLITE_BUSY. If the +first statement after BEGIN DEFERRED is a write statement, then +a write transaction is started. +</p> + +<p> +IMMEDIATE cause the database connection to start a new write +immediately, without waiting for a write statement. The +BEGIN IMMEDIATE might fail with <a href="rescode.html#busy">SQLITE_BUSY</a> if another write +transaction is already active on another database connection. +</p> + +<p> +EXCLUSIVE is similar to IMMEDIATE in that a write transaction +is started immediately. EXCLUSIVE and IMMEDIATE are the same +in <a href="wal.html">WAL mode</a>, but in other journaling modes, EXCLUSIVE prevents +other database connections from reading the database while the +transaction is underway. +</p> + +<h2 id="implicit_versus_explicit_transactions"><span>2.3. </span>Implicit versus explicit transactions</h2> + +<p> +An implicit transaction (a transaction that is started automatically, +not a transaction started by BEGIN) is committed automatically when +the last active statement finishes. A statement finishes when its +last cursor closes, which is guaranteed to happen when the +prepared statement is <a href="c3ref/reset.html">reset</a> or +<a href="c3ref/finalize.html">finalized</a>. Some statements might "finish" +for the purpose of transaction control prior to being reset or finalized, +but there is no guarantee of this. The only way to ensure that a +statement has "finished" is to invoke <a href="c3ref/reset.html">sqlite3_reset()</a> or +<a href="c3ref/finalize.html">sqlite3_finalize()</a> on that statement. An open <a href="c3ref/blob.html">sqlite3_blob</a> used for +incremental BLOB I/O also counts as an unfinished statement. +The <a href="c3ref/blob.html">sqlite3_blob</a> finishes when it is <a href="c3ref/blob_close.html">closed</a>. +</p> + +<p> +The explicit COMMIT command runs immediately, even if there are +pending <a href="lang_select.html">SELECT</a> statements. However, if there are pending +write operations, the COMMIT command +will fail with an error code <a href="rescode.html#busy">SQLITE_BUSY</a>. +</p> + +<p> +An attempt to execute COMMIT might also result in an <a href="rescode.html#busy">SQLITE_BUSY</a> return code +if an another thread or process has an open read connection. +When COMMIT fails in this +way, the transaction remains active and the COMMIT can be retried later +after the reader has had a chance to clear. +</p> + +<p> +In very old versions of SQLite (before version 3.7.11 - 2012-03-20) +the ROLLBACK will fail with an error code +<a href="rescode.html#busy">SQLITE_BUSY</a> if there are any pending queries. In more recent +versions of SQLite, the ROLLBACK will proceed and pending statements +will often be aborted, causing them to return an <a href="rescode.html#abort">SQLITE_ABORT</a> or +<a href="rescode.html#abort_rollback">SQLITE_ABORT_ROLLBACK</a> error. +In SQLite version 3.8.8 (2015-01-16) and later, +a pending read will continue functioning +after the ROLLBACK as long as the ROLLBACK does not modify the database +schema. +</p> + +<p> +If <a href="pragma.html#pragma_journal_mode">PRAGMA journal_mode</a> is set to OFF (thus disabling the rollback journal +file) then the behavior of the ROLLBACK command is undefined. +</p> + +<h1 id="response_to_errors_within_a_transaction"><span>3. </span>Response To Errors Within A Transaction</h1> + +<p> If certain kinds of errors occur within a transaction, the +transaction may or may not be rolled back automatically. The +errors that can cause an automatic rollback include:</p> + +<ul> +<li> <a href="rescode.html#full">SQLITE_FULL</a>: database or disk full +</li><li> <a href="rescode.html#ioerr">SQLITE_IOERR</a>: disk I/O error +</li><li> <a href="rescode.html#busy">SQLITE_BUSY</a>: database in use by another process +</li><li> <a href="rescode.html#nomem">SQLITE_NOMEM</a>: out of memory +</li></ul> + +<p> +For all of these errors, SQLite attempts to undo just the one statement +it was working on and leave changes from prior statements within the +same transaction intact and continue with the transaction. However, +depending on the statement being evaluated and the point at which the +error occurs, it might be necessary for SQLite to rollback and +cancel the entire transaction. An application can tell which +course of action SQLite took by using the +<a href="c3ref/get_autocommit.html">sqlite3_get_autocommit()</a> C-language interface.</p> + +<p>It is recommended that applications respond to the errors +listed above by explicitly issuing a ROLLBACK command. If the +transaction has already been rolled back automatically +by the error response, then the ROLLBACK command will fail with an +error, but no harm is caused by this.</p> + +<p>Future versions of SQLite may extend the list of errors which +might cause automatic transaction rollback. Future versions of +SQLite might change the error response. In particular, we may +choose to simplify the interface in future versions of SQLite by +causing the errors above to force an unconditional rollback.</p> +<p align="center"><small><i>This page last modified on <a href="https://sqlite.org/docsrc/honeypot" id="mtimelink" data-href="https://sqlite.org/docsrc/finfo/pages/lang_transaction.in?m=44e02f89eb1112b5a">2020-07-09 15:12:58</a> UTC </small></i></p> + |