317 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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;
 | 
						|
}
 | 
						|
</script>
 | 
						|
</div>
 | 
						|
<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='x2017' onclick='hideorshow("x2017","x2018")'>hide</button></p>
 | 
						|
 <div id='x2018' class='imgcontainer'>
 | 
						|
 <img alt="syntax diagram begin-stmt" src="images/syntax/begin-stmt.gif" />
 | 
						|
</div>
 | 
						|
<p><b><a href="syntax/commit-stmt.html">commit-stmt:</a></b>
 | 
						|
<button id='x2019' onclick='hideorshow("x2019","x2020")'>hide</button></p>
 | 
						|
 <div id='x2020' class='imgcontainer'>
 | 
						|
 <img alt="syntax diagram commit-stmt" src="images/syntax/commit-stmt.gif" />
 | 
						|
</div>
 | 
						|
<p><b><a href="syntax/rollback-stmt.html">rollback-stmt:</a></b>
 | 
						|
<button id='x2021' onclick='hideorshow("x2021","x2022")'>hide</button></p>
 | 
						|
 <div id='x2022' class='imgcontainer'>
 | 
						|
 <img alt="syntax diagram rollback-stmt" src="images/syntax/rollback-stmt.gif" />
 | 
						|
</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>
 | 
						|
 |