From e5214a5d423733ea2afd1d25ad41d7aa2d9a2993 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Mon, 24 Jul 2006 15:26:27 +0000 Subject: [PATCH] Renamed RetryingTransaction to RetryingTransactionHelper, HibernateRetryingTransaction to HibernateRetryingTransactionHelper. Changed propagation mode of AVM transactions to PROPAGATION_REQUIRED and tweaked to not retry in a transaction that wasn't started locally. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3389 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/avm-base-context.xml | 6 +++--- .../org/alfresco/repo/avm/AVMServiceImpl.java | 4 ++-- ...=> HibernateRetryingTransactionHelper.java} | 18 +++++++++++++----- source/java/org/alfresco/repo/avm/Issuer.java | 4 ++-- .../org/alfresco/repo/avm/OrphanReaper.java | 4 ++-- ...ion.java => RetryingTransactionHelper.java} | 2 +- 6 files changed, 23 insertions(+), 15 deletions(-) rename source/java/org/alfresco/repo/avm/{HibernateRetryingTransaction.java => HibernateRetryingTransactionHelper.java} (90%) rename source/java/org/alfresco/repo/avm/{RetryingTransaction.java => RetryingTransactionHelper.java} (94%) diff --git a/config/alfresco/avm-base-context.xml b/config/alfresco/avm-base-context.xml index d47b7bd2b6..3ec1d31b7d 100644 --- a/config/alfresco/avm-base-context.xml +++ b/config/alfresco/avm-base-context.xml @@ -211,7 +211,7 @@ - PROPAGATION_REQUIRES_NEW + PROPAGATION_REQUIRED ISOLATION_READ_COMMITTED @@ -225,7 +225,7 @@ - PROPAGATION_REQUIRES_NEW + PROPAGATION_REQUIRED ISOLATION_READ_COMMITTED @@ -237,7 +237,7 @@ + class="org.alfresco.repo.avm.HibernateRetryingTransactionHelper"> diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 429bd7b4ec..54b2e05a6d 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -44,7 +44,7 @@ class AVMServiceImpl implements AVMService /** * The RetryingTransaction. */ - private RetryingTransaction fTransaction; + private RetryingTransactionHelper fTransaction; /** * The AVMRepository for each service thread. @@ -94,7 +94,7 @@ class AVMServiceImpl implements AVMService * Set the Retrying Transaction wrapper. * @param txn */ - public void setRetryingTransaction(RetryingTransaction txn) + public void setRetryingTransaction(RetryingTransactionHelper txn) { fTransaction = txn; } diff --git a/source/java/org/alfresco/repo/avm/HibernateRetryingTransaction.java b/source/java/org/alfresco/repo/avm/HibernateRetryingTransactionHelper.java similarity index 90% rename from source/java/org/alfresco/repo/avm/HibernateRetryingTransaction.java rename to source/java/org/alfresco/repo/avm/HibernateRetryingTransactionHelper.java index 1a4ac9089e..503b8d8cef 100644 --- a/source/java/org/alfresco/repo/avm/HibernateRetryingTransaction.java +++ b/source/java/org/alfresco/repo/avm/HibernateRetryingTransactionHelper.java @@ -26,16 +26,15 @@ import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; /** * Helper for DAOs. * @author britt */ -class HibernateRetryingTransaction extends HibernateTemplate implements RetryingTransaction +class HibernateRetryingTransactionHelper extends HibernateTemplate implements RetryingTransactionHelper { - private static Logger fgLogger = Logger.getLogger(HibernateRetryingTransaction.class); + private static Logger fgLogger = Logger.getLogger(HibernateRetryingTransactionHelper.class); /** * The transaction manager. @@ -61,7 +60,7 @@ class HibernateRetryingTransaction extends HibernateTemplate implements Retrying * Make one up. * @param sessionFactory The SessionFactory. */ - HibernateRetryingTransaction() + HibernateRetryingTransactionHelper() { fRandom = new Random(); } @@ -77,12 +76,17 @@ class HibernateRetryingTransaction extends HibernateTemplate implements Retrying while (true) { TransactionStatus status = null; + boolean newTxn = true; try { status = fTransactionManager.getTransaction(write ? fWriteDefinition : fReadDefinition); + newTxn = status.isNewTransaction(); execute(new HibernateCallbackWrapper(callback)); - fTransactionManager.commit(status); + if (newTxn) + { + fTransactionManager.commit(status); + } return; } catch (Throwable t) @@ -96,6 +100,10 @@ class HibernateRetryingTransaction extends HibernateTemplate implements Retrying { fTransactionManager.rollback(status); } + if (!newTxn) + { + throw new AVMException("Unrecoverable error.", t); + } // If we've lost a race or we've deadlocked, retry. if (t instanceof DeadlockLoserDataAccessException) { diff --git a/source/java/org/alfresco/repo/avm/Issuer.java b/source/java/org/alfresco/repo/avm/Issuer.java index 466ed623de..d53fb252f4 100644 --- a/source/java/org/alfresco/repo/avm/Issuer.java +++ b/source/java/org/alfresco/repo/avm/Issuer.java @@ -36,7 +36,7 @@ class Issuer /** * The transactional wrapper. */ - private RetryingTransaction fTransaction; + private RetryingTransactionHelper fTransaction; /** * Default constructor. @@ -58,7 +58,7 @@ class Issuer * Set the transactional wrapper. * @param retryingTransaction The transactional wrapper. */ - public void setRetryingTransaction(RetryingTransaction retryingTransaction) + public void setRetryingTransaction(RetryingTransactionHelper retryingTransaction) { fTransaction = retryingTransaction; } diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index 4afdb698c6..c3c858ebd4 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -33,7 +33,7 @@ class OrphanReaper implements Runnable /** * The HibernateTxn instance. */ - private RetryingTransaction fTransaction; + private RetryingTransactionHelper fTransaction; /** * Inactive base sleep interval. @@ -111,7 +111,7 @@ class OrphanReaper implements Runnable * Set the Hibernate Transaction Wrapper. * @param transaction */ - public void setRetryingTransaction(RetryingTransaction transaction) + public void setRetryingTransaction(RetryingTransactionHelper transaction) { fTransaction = transaction; } diff --git a/source/java/org/alfresco/repo/avm/RetryingTransaction.java b/source/java/org/alfresco/repo/avm/RetryingTransactionHelper.java similarity index 94% rename from source/java/org/alfresco/repo/avm/RetryingTransaction.java rename to source/java/org/alfresco/repo/avm/RetryingTransactionHelper.java index 4e8c0a0fb6..195948ba88 100644 --- a/source/java/org/alfresco/repo/avm/RetryingTransaction.java +++ b/source/java/org/alfresco/repo/avm/RetryingTransactionHelper.java @@ -6,7 +6,7 @@ package org.alfresco.repo.avm; * when a transaction fails for synchronization reasons. * @author britt */ -interface RetryingTransaction +interface RetryingTransactionHelper { /** * Perform a set of operations under a single transaction.