1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4  <head>
5    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6    <title>Read/Modify/Write</title>
7    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
8    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
9    <link rel="start" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
10    <link rel="up" href="txnconcurrency.html" title="Chapter 4. Concurrency" />
11    <link rel="prev" href="txn_ccursor.html" title="Transactional Cursors and Concurrent Applications" />
12    <link rel="next" href="txnnowait.html" title="No Wait on Blocks" />
13  </head>
14  <body>
15    <div class="navheader">
16      <table width="100%" summary="Navigation header">
17        <tr>
18          <th colspan="3" align="center">Read/Modify/Write</th>
19        </tr>
20        <tr>
21          <td width="20%" align="left"><a accesskey="p" href="txn_ccursor.html">Prev</a> </td>
22          <th width="60%" align="center">Chapter 4. Concurrency</th>
23          <td width="20%" align="right"> <a accesskey="n" href="txnnowait.html">Next</a></td>
24        </tr>
25      </table>
26      <hr />
27    </div>
28    <div class="sect1" lang="en" xml:lang="en">
29      <div class="titlepage">
30        <div>
31          <div>
32            <h2 class="title" style="clear: both"><a id="readmodifywrite"></a>Read/Modify/Write</h2>
33          </div>
34        </div>
35      </div>
36      <p>
37            If you are retrieving 
38                
39                
40                <span>a record from the database or a class from the store</span>
41            for the purpose of modifying or deleting it, you should declare 
42            a read-modify-write cycle at the time that you read the 
43                    <span>record.</span>
44                    
45            Doing so causes DB to obtain write locks (instead of a read
46            locks) at the time of the read. This helps to prevent deadlocks by
47            preventing another transaction from acquiring a read lock on the same
48            record while the read-modify-write cycle is in progress.
49        </p>
50      <p>
51            Note that declaring a read-modify-write cycle may actually increase the amount of blocking that your
52            application sees, because readers immediately obtain write locks and write locks cannot be shared. For this
53            reason, you should use read-modify-write cycles only if you are seeing a large amount of deadlocking
54            occurring in your application.
55        </p>
56      <p>
57            In order to declare a read/modify/write cycle when you perform a
58            read operation, 
59
60            
61
62            
63
64            <span>
65                specify 
66                    <code class="classname">com.sleepycat.db.LockMode.RMW</code>
67                    
68                    to the database, cursor,
69                    <code class="classname">PrimaryIndex</code>, or
70                    <code class="classname">SecondaryIndex</code> get method.
71            </span>
72        </p>
73      <p>
74            For example:
75        </p>
76      <pre class="programlisting">// Begin the deadlock retry loop as is normal.
77while (retry_count &lt; MAX_DEADLOCK_RETRIES) {
78    try {
79        txn = myEnv.beginTransaction(null, null);
80
81        ...
82        // key and data are DatabaseEntry objects.
83        // Their usage is omitted for brevity.
84        ...
85
86        // Read the data. Declare the read/modify/write cycle here
87        myDatabase.get(txn, key, data, LockMode.RMW);
88
89
90        // Put the data. Note that you do not have to provide any 
91        // additional flags here due to the read/modify/write 
92        // cycle. Simply put the data and perform your deadlock 
93        // detection as normal.
94        myDatabase.put(txn, key, data);
95        txn.commit();
96        return 0;
97    } catch (DeadlockException de) {
98        // Deadlock detection and exception handling omitted
99        // for brevity
100        ... </pre>
101      <p>
102        Or, with the DPL:
103</p>
104      <pre class="programlisting">// Begin the deadlock retry loop as is normal
105        while (retry_count &lt; MAX_DEADLOCK_RETRIES) {
106    try {
107        txn = myEnv.beginTransaction(null, null);
108
109        ...
110        // 'store' is an EntityStore and 'Inventory' is an entity class
111        // Their usage and implementation is omitted for brevity.
112        ...
113
114        // Read the data, using the PrimaryIndex for the entity object
115        PrimaryIndex&lt;String,Inventory&gt; pi = 
116                store.getPrimaryIndex(String.class, Inventory.class);
117        Inventory iv = pi.get(txn, "somekey", LockMode.RMW);
118
119        // Do something to the retreived object
120
121
122        // Put the object. Note that you do not have to provide any 
123        // additional flags here due to the read/modify/write 
124        // cycle. Simply put the data and perform your deadlock 
125        // detection as normal.
126
127        pi.put(txn, iv);
128        txn.commit();
129        return 0;
130
131    } catch (DeadlockException de) {
132        // Deadlock detection and exception handling omitted
133        // for brevity
134        ... </pre>
135    </div>
136    <div class="navfooter">
137      <hr />
138      <table width="100%" summary="Navigation footer">
139        <tr>
140          <td width="40%" align="left"><a accesskey="p" href="txn_ccursor.html">Prev</a> </td>
141          <td width="20%" align="center">
142            <a accesskey="u" href="txnconcurrency.html">Up</a>
143          </td>
144          <td width="40%" align="right"> <a accesskey="n" href="txnnowait.html">Next</a></td>
145        </tr>
146        <tr>
147          <td width="40%" align="left" valign="top">Transactional Cursors and Concurrent Applications </td>
148          <td width="20%" align="center">
149            <a accesskey="h" href="index.html">Home</a>
150          </td>
151          <td width="40%" align="right" valign="top"> No Wait on Blocks</td>
152        </tr>
153      </table>
154    </div>
155  </body>
156</html>
157