You transactionally protect a cursor by opening it using a transaction. All operations performed with that cursor are subsequently performed within the scope of that transaction. You must be sure to close the cursor before committing the transaction.
For example:
package com.sleepycat.examples.je.gettingStarted; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.Environment; import com.sleepycat.je.Cursor; import com.sleepycat.je.Transaction; ... Cursor cursor = null; Database myDb = null; Environment myEnv = null; Transaction txn = null; try { ... // Environment and database opens omitted for brevity ... DatabaseEntry key1 = new DatabaseEntry((new String("key1")).getBytes("UTF-8")); DatabaseEntry data1 = new DatabaseEntry((new String("data1")).getBytes("UTF-8")); DatabaseEntry key2 = new DatabaseEntry((new String("key2")).getBytes("UTF-8")); DatabaseEntry data2 = new DatabaseEntry((new String("data2")).getBytes("UTF-8")); // Start a transaction txn = myEnv.beginTransaction(null, null); // Open a cursor using the transaction cursor = myDb.openCursor(txn, null); // Put the data. This is transactionally protected cursor.put(key1, data1); cursor.put(key2, data2); } catch (Exception e) { // If an error occurs, close the cursor and abort. // None of the write operations performed by this cursor // will appear in the Database. System.err.println("Error putting data: " + e.toString()); try { if (cursor != null) { cursor.close(); cursor = null; } if (txn != null) { txn.abort(); txn = null; } } catch (DatabaseException dbe) { // Error reporting goes here } } finally { try { // Close the cursor and then commit the transaction if (cursor != null) { cursor.close(); } if (txn != null) { txn.commit(); } } catch (DatabaseException dbe) { // Error reporting goes here } }