package org.reldb.rel.v0.storage; import org.reldb.rel.exceptions.ExceptionFatal; import com.sleepycat.je.*; public class RelTransaction { private int referenceCount; private Transaction transaction; private boolean aborting; private boolean aborted; public RelTransaction(Transaction txn) { transaction = txn; referenceCount = 1; aborting = false; aborted = false; // System.out.println("TRANSACTION: start: " + transaction); } public Transaction getTransaction() { return transaction; } void addReference() { referenceCount++; } int getReferenceCount() { return referenceCount; } void abort() { aborting = true; if (--referenceCount > 0) return; try { transaction.abort(); aborted = true; // System.out.println("TRANSACTION: abort: " + transaction); } catch (DatabaseException de) { throw new ExceptionFatal("RS0365: abort failed: " + de); } } void commit() { if (--referenceCount > 0) return; try { if (aborting && !aborted) { transaction.abort(); aborted = true; // System.out.println("TRANSACTION: abort: " + transaction); } else { transaction.commit(); // System.out.println("TRANSACTION: commit: " + transaction); } } catch (DatabaseException de) { throw new ExceptionFatal("RS0366: commit failed: " + de); } } public String toString() { return transaction.toString(); } }