From 9d335c5992146257dc6ddd303532cc3c8452878d Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Fri, 30 Jul 2010 11:41:54 -0400 Subject: [PATCH] applied Michael Hunger's transaction manager fix --- .../NaiveDoubleTransactionManager.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/persistence/transaction/NaiveDoubleTransactionManager.java b/src/main/java/org/springframework/persistence/transaction/NaiveDoubleTransactionManager.java index 653c9e44e..b4e11742f 100644 --- a/src/main/java/org/springframework/persistence/transaction/NaiveDoubleTransactionManager.java +++ b/src/main/java/org/springframework/persistence/transaction/NaiveDoubleTransactionManager.java @@ -1,5 +1,8 @@ package org.springframework.persistence.transaction; +import java.util.IdentityHashMap; +import java.util.Map; + import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; @@ -7,7 +10,7 @@ import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionStatus; public class NaiveDoubleTransactionManager implements PlatformTransactionManager { - + Map status=new IdentityHashMap(); private final PlatformTransactionManager a; private final PlatformTransactionManager b; @@ -20,7 +23,8 @@ public class NaiveDoubleTransactionManager implements PlatformTransactionManager @Override public void commit(TransactionStatus ts) throws TransactionException { - TransactionStatus tsb = copyTransactionStatus(ts); + try { + final TransactionStatus tsb = copyTransactionStatus(status.get(ts)); try { a.commit(ts); } @@ -34,10 +38,14 @@ public class NaiveDoubleTransactionManager implements PlatformTransactionManager System.err.println("Can't commit tx" + t); throw new TransactionException(t.getMessage(), t) {}; } + } finally { + status.remove(ts); + } } private TransactionStatus copyTransactionStatus(TransactionStatus ts) { - return new DefaultTransactionStatus(null, ts.isNewTransaction(), false, false, false, null); + Object t = (ts instanceof DefaultTransactionStatus) ? ((DefaultTransactionStatus) ts).getTransaction() : null; + return new DefaultTransactionStatus(t,ts.isNewTransaction(), false, false, false, null); } @Override @@ -45,12 +53,13 @@ public class NaiveDoubleTransactionManager implements PlatformTransactionManager throws TransactionException { TransactionStatus atx = a.getTransaction(td); TransactionStatus btx = b.getTransaction(td); + status.put(atx, btx); return atx; } @Override public void rollback(TransactionStatus ts) throws TransactionException { - TransactionStatus tsb = copyTransactionStatus(ts); + final TransactionStatus tsb = copyTransactionStatus(status.remove(ts)); try { a.rollback(ts); }