Transactional Cursors
Prev | Chapter 3. Transaction Basics | Next

## Transactional Cursors

You can transaction-protect your cursor operations by specifying a transaction handle at the time that you create your cursor. Beyond that, you do not ever provide a transaction handle directly to a cursor method.

Note that if you transaction-protect a cursor, then you must make sure that the cursor is closed before you either commit or abort the transaction. For example:

    package db.txn;

    import com.sleepycat.db.Cursor;
    import com.sleepycat.db.Database;
    import com.sleepycat.db.DatabaseConfig;
    import com.sleepycat.db.DatabaseEntry;
    import com.sleepycat.db.DatabaseException;
    import com.sleepycat.db.Environment;
    import com.sleepycat.db.EnvironmentConfig;
    import com.sleepycat.db.LockMode;
    import com.sleepycat.db.OperationStatus;
    import com.sleepycat.db.Transaction;

    import java.io.File;

    ...

    Database myDatabase = null;
    Environment myEnv = null;
    try {

        // Database and environment opens omitted

        String replacementData = "new data";

        Transaction txn = myEnv.beginTransaction(null, null);
        Cursor cursor = null;
        try {
            // Use the transaction handle here
            cursor = db.openCursor(txn, null);
            DatabaseEntry key, data;

            DatabaseEntry key, data;
            while(cursor.getNext(key, data, LockMode.DEFAULT) ==
               OperationStatus.SUCCESS) {

                data.setData(replacementData.getBytes("UTF-8"));
                // No transaction handle is used on the cursor read or write
                // methods.
                cursor.putCurrent(data);
            }

            cursor.close();
            cursor = null;
            txn.commit();
            txn = null;
        } catch (Exception e) {
            if (cursor != null) {
                cursor.close();
            }
            if (txn != null) {
                txn.abort();
                txn = null;
            }
        }

    } catch (DatabaseException de) {
        // Exception handling goes here
    }

Prev | Up | Next
Nested Transactions | Home | Secondary Indices with Transaction Applications