libdb/docs/gsg_txn/C/readmodifywrite.html
2011-09-13 13:44:24 -04:00

125 lines
4.8 KiB
HTML
Raw 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>Read/Modify/Write</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
<link rel="up" href="txnconcurrency.html" title="Chapter 4. Concurrency" />
<link rel="prev" href="txn_ccursor.html" title="Transactional Cursors and Concurrent Applications" />
<link rel="next" href="txnnowait.html" title="No Wait on Blocks" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.2</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Read/Modify/Write</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="txn_ccursor.html">Prev</a> </td>
<th width="60%" align="center">Chapter 4. Concurrency</th>
<td width="20%" align="right"> <a accesskey="n" href="txnnowait.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="readmodifywrite"></a>Read/Modify/Write</h2>
</div>
</div>
</div>
<p>
If you are retrieving
<span>a record from the database</span>
for the purpose of modifying or deleting it, you should declare
a read-modify-write cycle at the time that you read the
<span>record.</span>
Doing so causes DB to obtain write locks (instead of a read
locks) at the time of the read. This helps to prevent deadlocks by
preventing another transaction from acquiring a read lock on the same
record while the read-modify-write cycle is in progress.
</p>
<p>
Note that declaring a read-modify-write cycle may actually increase the amount of blocking that your
application sees, because readers immediately obtain write locks and write locks cannot be shared. For this
reason, you should use read-modify-write cycles only if you are seeing a large amount of deadlocking
occurring in your application.
</p>
<p>
In order to declare a read/modify/write cycle when you perform a
read operation,
<span>
pass the <code class="literal">DB_RMW</code> flag
<span>
to the database or cursor get method.
</span>
</span>
</p>
<p>
For example:
</p>
<pre class="programlisting">retry:
/* Get the transaction */
ret = envp-&gt;txn_begin(envp, NULL, &amp;txn, 0);
if (ret != 0) {
envp-&gt;err(envp, ret, "txn_begin failed");
return (EXIT_FAILURE);
}
...
/* key and data are Dbts. Their usage is omitted for brevity. */
...
/* Get the data. Declare the read/modify/write cycle here */
ret = dbp-&gt;get(dbp, txn, &amp;key, &amp;data, DB_RMW);
...
/* Modify the key and data as is required (not shown here) */
...
/* Put the data. Note that you do not have to provide any additional
* flags here due to the read/modify/write cycle. Simply put the
* data and perform your deadlock detection as normal.
*/
ret = dbp-&gt;put(dbp, txn, &amp;key, &amp;data, 0);
switch (ret) {
/* Deadlock detection omitted for brevity */
.... </pre>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="txn_ccursor.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="txnconcurrency.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="txnnowait.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Transactional Cursors and Concurrent Applications </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> No Wait on Blocks</td>
</tr>
</table>
</div>
</body>
</html>