Files
cpython-source-deps/docs/gsg_txn/C/autocommit.html
2017-09-04 13:40:25 -05:00

232 lines
8.1 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Auto Commit</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.62.4" />
<link rel="home" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
<link rel="up" href="usingtxns.html" title="Chapter 3. Transaction Basics" />
<link rel="previous" href="abortresults.html" title="Aborting a Transaction" />
<link rel="next" href="nestedtxn.html" title="Nested Transactions" />
</head>
<body>
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Auto Commit</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="abortresults.html">Prev</a> </td>
<th width="60%" align="center">Chapter 3. Transaction Basics</th>
<td width="20%" align="right"> <a accesskey="n" href="nestedtxn.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="autocommit"></a>Auto Commit</h2>
</div>
</div>
<div></div>
</div>
<p>
While transactions are frequently used to provide atomicity to
multiple database
operations, it is sometimes necessary to perform
a single database
operation under the control of a transaction.
Rather than force you to obtain a transaction, perform the single
write operation, and then either commit or abort the transaction,
you can automatically group this sequence of events using
<span class="emphasis"><em>auto commit</em></span>.
</p>
<p>
To use auto commit:
</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>
Open your environment and your databases
so that they support
transactions. See <a href="enabletxn.html">Enabling Transactions</a>
for details.
</p>
<p>
Note that frequently auto commit is used for the environment
or database open. To use auto commit for either your
environment or database open, specify
<tt class="literal">DB_AUTO_COMMIT</tt> to the
<tt class="methodname">DB_ENV-&gt;set_flags()</tt>
or
<tt class="methodname">DB-&gt;open()</tt>
method. If you specify auto commit for the environment
open, then you do not need to also specify auto commit
for the database open.
</p>
</li>
<li>
<p>
Do not provide a transactional handle to the method that is
performing the database
write operation.
</p>
</li>
</ol>
</div>
<p>
Note that auto commit is not available for cursors. You must always
open your cursor using a transaction if you want the cursor's
operations to be transactional protected. See
<a href="txncursor.html">Transactional Cursors</a> for details on using
transactional cursors.
</p>
<p>
For example, the following uses auto commit to perform the database write operation:
</p>
<pre class="programlisting">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "db.h"
int
main(void)
{
int ret, ret_c;
u_int32_t db_flags, env_flags;
DB *dbp;
DB_ENV *envp;
DBT key, data;
const char *db_home_dir = "/tmp/myEnvironment";
const char *file_name = "mydb.db";
const char *keystr ="thekey";
const char *datastr = "thedata";
dbp = NULL;
envp = NULL;
/* Open the environment */
ret = db_env_create(&amp;envp, 0);
if (ret != 0) {
fprintf(stderr, "Error creating environment handle: %s\n",
db_strerror(ret));
return (EXIT_FAILURE);
}
env_flags = DB_CREATE | /* Create the environment if it does
* not already exist. */
DB_INIT_TXN | /* Initialize transactions */
DB_INIT_LOCK | /* Initialize locking. */
DB_INIT_LOG | /* Initialize logging */
DB_INIT_MPOOL; /* Initialize the in-memory cache. */
ret = envp-&gt;open(envp, db_home_dir, env_flags, 0);
if (ret != 0) {
fprintf(stderr, "Error opening environment: %s\n",
db_strerror(ret));
goto err;
}
/* Initialize the DB handle */
ret = db_create(&amp;dbp, envp, 0);
if (ret != 0) {
envp-&gt;err(envp, ret, "Database creation failed");
goto err;
}
db_flags = DB_CREATE | DB_AUTO_COMMIT;
/*
* Open the database. Note that we are using auto commit for the open,
* so the database is able to support transactions.
*/
ret = dbp-&gt;open(dbp, /* Pointer to the database */
NULL, /* Txn pointer */
file_name, /* File name */
NULL, /* Logical db name */
DB_BTREE, /* Database type (using btree) */
db_flags, /* Open flags */
0); /* File mode. Using defaults */
if (ret != 0) {
envp-&gt;err(envp, ret, "Database '%s' open failed",
file_name);
goto err;
}
/* Prepare the DBTs */
memset(&amp;key, 0, sizeof(DBT));
memset(&amp;data, 0, sizeof(DBT));
key.data = &amp;keystr;
key.size = strlen(keystr) + 1;
data.data = &amp;datastr;
data.size = strlen(datastr) + 1;
/*
* Perform the database write. A txn handle is not provided, but the
* database support auto commit, so auto commit is used for the write.
*/
ret = dbp-&gt;put(dbp, NULL, &amp;key, &amp;data, 0);
if (ret != 0) {
envp-&gt;err(envp, ret, "Database put failed.");
goto err;
}
err:
/* Close the database */
if (dbp != NULL) {
ret_c = dbp-&gt;close(dbp, 0);
if (ret_c != 0) {
envp-&gt;err(envp, ret_c, "Database close failed.");
ret = ret_c
}
}
/* Close the environment */
if (envp != NULL) {
ret_c = envp-&gt;close(envp, 0);
if (ret_c != 0) {
fprintf(stderr, "environment close failed: %s\n",
db_strerror(ret_c));
ret = ret_c;
}
}
return (ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
} </pre>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="abortresults.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="usingtxns.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="nestedtxn.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Aborting a Transaction </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Nested Transactions</td>
</tr>
</table>
</div>
</body>
</html>