diff options
author | Brian S. O'Neill <bronee@gmail.com> | 2010-01-18 19:06:09 +0000 |
---|---|---|
committer | Brian S. O'Neill <bronee@gmail.com> | 2010-01-18 19:06:09 +0000 |
commit | 3baee4ce35e6ae0afc0581809d8ca8c66a170e20 (patch) | |
tree | 14e25c4ba7fd8f76c795e3d76c6029457c0173bd | |
parent | c3d44c4637c4b7eafe95dc0352f0345b7447a3d0 (diff) |
Add attach/detach notification.
-rw-r--r-- | src/main/java/com/amazon/carbonado/txn/TransactionManager.java | 25 | ||||
-rw-r--r-- | src/main/java/com/amazon/carbonado/txn/TransactionScope.java | 18 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/main/java/com/amazon/carbonado/txn/TransactionManager.java b/src/main/java/com/amazon/carbonado/txn/TransactionManager.java index 0f203aa..45a2028 100644 --- a/src/main/java/com/amazon/carbonado/txn/TransactionManager.java +++ b/src/main/java/com/amazon/carbonado/txn/TransactionManager.java @@ -80,6 +80,7 @@ public abstract class TransactionManager<Txn> { TransactionScope<Txn> scope = mLocalScope.get();
if (scope != null) {
scope.markDetached();
+ detachNotification(scope.getActiveTxn());
mLocalScope.remove();
}
return scope;
@@ -89,6 +90,7 @@ public abstract class TransactionManager<Txn> { boolean removeLocalScope(TransactionScope<Txn> scope) {
TransactionScope<Txn> existing = mLocalScope.get();
if (existing == scope) {
+ detachNotification(scope.getActiveTxn());
mLocalScope.remove();
return true;
}
@@ -99,6 +101,7 @@ public abstract class TransactionManager<Txn> { boolean setLocalScope(TransactionScope<Txn> scope, boolean detached) {
TransactionScope<Txn> existing = mLocalScope.get();
if (((existing == null || existing.isInactive()) && detached) || existing == scope) {
+ attachNotification(scope.getActiveTxn());
mLocalScope.set(scope);
return true;
}
@@ -213,6 +216,28 @@ public abstract class TransactionManager<Txn> { }
/**
+ * Called to notify internal method that transaction is attached.
+ * The default implementation of this method does nothing. Override if
+ * using remote transactions.
+ *
+ * @param txn transaction that is attached, could be null if none exists
+ * @since 1.2.2
+ */
+ protected void attachNotification(Txn txn) {
+ }
+
+ /**
+ * Called to notify internal method that transaction is detached.
+ * The default implementation of this method does nothing. Override if
+ * using remote transactions.
+ *
+ * @param txn transaction that is dettached, could be null if none exists
+ * @since 1.2.2
+ */
+ protected void detachNotification(Txn txn) {
+ }
+
+ /**
* Commits and closes the given internal transaction.
*
* @return true if transaction object is still valid
diff --git a/src/main/java/com/amazon/carbonado/txn/TransactionScope.java b/src/main/java/com/amazon/carbonado/txn/TransactionScope.java index 4def72d..61f4b6a 100644 --- a/src/main/java/com/amazon/carbonado/txn/TransactionScope.java +++ b/src/main/java/com/amazon/carbonado/txn/TransactionScope.java @@ -193,6 +193,19 @@ public class TransactionScope<Txn> { mLock.unlock();
}
}
+
+ /**
+ * Returns the implementation for the active transaction, only if it exists.
+ */
+ Txn getActiveTxn() {
+ mLock.lock();
+ try {
+ checkClosed();
+ return mActive == null ? null : mActive.getActiveTxn();
+ } finally {
+ mLock.unlock();
+ }
+ }
/**
* Returns true if an active transaction exists and it is for update.
@@ -501,6 +514,11 @@ public class TransactionScope<Txn> { }
// Caller must hold mLock.
+ Txn getActiveTxn() {
+ return mTxn;
+ }
+
+ // Caller must hold mLock.
private void closeCursors() throws PersistException {
if (mCursorList != null) {
mCursorList.closeCursors();
|