Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9723
Modified Files:
AbstractPlatformTransactionManager.cs
DefaultTransactionStatus.cs ISmartTransactionObject.cs
Log Message:
NHibernate unit tests
SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null
SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported
Index: AbstractPlatformTransactionManager.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -d -r1.21 -r1.22
*** AbstractPlatformTransactionManager.cs 4 Jul 2007 19:57:41 -0000 1.21
--- AbstractPlatformTransactionManager.cs 29 Aug 2007 03:42:20 -0000 1.22
***************
*** 496,500 ****
private ITransactionStatus HandleExistingTransaction(ITransactionDefinition definition, object transaction, bool debugEnabled)
{
! bool newSynchronization;
if (definition.PropagationBehavior == TransactionPropagation.Never)
{
--- 496,500 ----
private ITransactionStatus HandleExistingTransaction(ITransactionDefinition definition, object transaction, bool debugEnabled)
{
! //bool newSynchronization;
if (definition.PropagationBehavior == TransactionPropagation.Never)
{
***************
*** 509,513 ****
}
object suspendedResources = suspend(transaction);
! newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always);
return
newTransactionStatus(definition, null, false, newSynchronization, debugEnabled,
--- 509,513 ----
}
object suspendedResources = suspend(transaction);
! bool newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always);
return
newTransactionStatus(definition, null, false, newSynchronization, debugEnabled,
***************
*** 542,546 ****
}
}
! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never);
return
newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
--- 542,546 ----
}
}
! bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never);
return
newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
***************
*** 569,573 ****
{
DoBegin(transaction, definition);
! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never);
return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);
--- 569,573 ----
{
DoBegin(transaction, definition);
! bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never);
return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);
***************
*** 578,583 ****
log.Debug("Participating in existing transaction");
}
! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never);
! return newTransactionStatus(definition, transaction, false, newSynchronization, debugEnabled, null);
}
--- 578,583 ----
log.Debug("Participating in existing transaction");
}
! bool newSynch = (_transactionSyncState != TransactionSynchronizationState.Never);
! return newTransactionStatus(definition, transaction, false, newSynch, debugEnabled, null);
}
***************
*** 605,609 ****
DefaultTransactionStatus defaultStatus = (DefaultTransactionStatus) transactionStatus;
! if (defaultStatus.RollbackOnly)
{
if (defaultStatus.Debug)
--- 605,609 ----
DefaultTransactionStatus defaultStatus = (DefaultTransactionStatus) transactionStatus;
! if (defaultStatus.LocalRollbackOnly)
{
if (defaultStatus.Debug)
***************
*** 611,621 ****
log.Debug("Transaction code has requested rollback");
}
! Rollback(transactionStatus);
return;
}
! else
{
! ProcessCommit(defaultStatus);
}
}
--- 611,635 ----
log.Debug("Transaction code has requested rollback");
}
! ProcessRollback(defaultStatus);
return;
}
! if (defaultStatus.GlobalRollbackOnly)
{
! if (defaultStatus.Debug)
! {
! log.Debug("Global transaction is marked as rollback-only but transactional code requested commit");
! }
! ProcessRollback(defaultStatus);
! // Throw UnexpectedRollbackException only at outermost transaction boundary
! // or if explicitly asked to.
! if (defaultStatus.IsNewTransaction)
! {
! throw new UnexpectedRollbackException(
! "Transaction rolled back because it has been marked as rollback-only");
! }
! return;
}
+ ProcessCommit(defaultStatus);
+
}
***************
*** 630,633 ****
--- 644,652 ----
triggerBeforeCompletion(status);
beforeCompletionInvoked = true;
+ bool globalRollbackOnly = false;
+ if (status.IsNewTransaction)
+ {
+ globalRollbackOnly = status.GlobalRollbackOnly;
+ }
if (status.HasSavepoint)
{
***************
*** 638,641 ****
--- 657,667 ----
DoCommit(status);
}
+ // Throw UnexpectedRollbackException if we have a global rollback-only
+ // marker but still didn't get a corresponding exception from commit.
+ if (globalRollbackOnly)
+ {
+ throw new UnexpectedRollbackException(
+ "Transaction silently rolled back because it has been marked as rollback-only");
+ }
}
catch (UnexpectedRollbackException)
***************
*** 648,652 ****
if (RollbackOnCommitFailure)
{
! doRollbackOnCommitException(status, ex);
}
else
--- 674,678 ----
if (RollbackOnCommitFailure)
{
! DoRollbackOnCommitException(status, ex);
}
else
***************
*** 662,666 ****
triggerBeforeCompletion(status);
}
! doRollbackOnCommitException(status, ex);
throw;
}
--- 688,692 ----
triggerBeforeCompletion(status);
}
! DoRollbackOnCommitException(status, ex);
throw;
}
***************
*** 766,771 ****
else if (status.HasTransaction())
{
! //TODO investigate spring 2.0 changes here.
! if (status.RollbackOnly)
{
if(status.Debug)
--- 792,796 ----
else if (status.HasTransaction())
{
! if (status.LocalRollbackOnly)
{
if(status.Debug)
***************
*** 808,812 ****
if (actualNewSynchronization)
{
! TransactionSynchronizationManager.ActualTransactionActive = transaction != null;
TransactionSynchronizationManager.CurrentTransactionIsolationLevel =
definition.TransactionIsolationLevel;
--- 833,837 ----
if (actualNewSynchronization)
{
! TransactionSynchronizationManager.ActualTransactionActive = (transaction != null);
TransactionSynchronizationManager.CurrentTransactionIsolationLevel =
definition.TransactionIsolationLevel;
***************
*** 957,961 ****
/// in case of a rollback error
/// </exception>
! private void doRollbackOnCommitException(DefaultTransactionStatus status, Exception exception)
{
try
--- 982,986 ----
/// in case of a rollback error
/// </exception>
! private void DoRollbackOnCommitException(DefaultTransactionStatus status, Exception exception)
{
try
***************
*** 969,976 ****
--- 994,1010 ----
DoRollback(status);
}
+ else if (status.HasTransaction())
+ {
+ if (status.Debug)
+ {
+ log.Debug("Marking existing transaction as rollback-only after commit exception", exception);
+ }
+ DoSetRollbackOnly(status);
+ }
}
catch (Exception)
{
//TODO investigate rollback behavior...
+ log.Error("Commit exception overridden by rollback exception", exception);
triggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown);
throw;
Index: ISmartTransactionObject.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/ISmartTransactionObject.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** ISmartTransactionObject.cs 18 May 2006 21:37:51 -0000 1.5
--- ISmartTransactionObject.cs 29 Aug 2007 03:42:20 -0000 1.6
***************
*** 40,48 ****
public interface ISmartTransactionObject
{
! /// <summary>
! /// Return whether the transaction is internally marked as rollback-only.
! /// </summary>
! /// <returns>True of the transaction is marked as rollback-only.</returns>
! bool IsRollbackOnly();
}
}
--- 40,51 ----
public interface ISmartTransactionObject
{
! /// <summary>
! /// Return whether the transaction is internally marked as rollback-only.
! /// </summary>
! /// <returns>True of the transaction is marked as rollback-only.</returns>
! bool RollbackOnly
! {
! get;
! }
}
}
Index: DefaultTransactionStatus.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/DefaultTransactionStatus.cs,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** DefaultTransactionStatus.cs 12 May 2007 17:49:47 -0000 1.12
--- DefaultTransactionStatus.cs 29 Aug 2007 03:42:20 -0000 1.13
***************
*** 216,222 ****
{
get {
! return ( _rollbackOnly ||
! ((_transaction is ISmartTransactionObject ) &&
! (( ISmartTransactionObject)_transaction).IsRollbackOnly()));
}
set { _rollbackOnly = value; }
--- 216,220 ----
{
get {
! return ( LocalRollbackOnly || GlobalRollbackOnly);
}
set { _rollbackOnly = value; }
***************
*** 224,227 ****
--- 222,248 ----
#endregion
+
+ /// <summary>
+ /// Determine the rollback-only flag via checking this TransactionStatus. Will only
+ /// return true if the application set the property RollbackOnly to true on this
+ /// TransactionStatus object.
+ /// </summary>
+ /// <value><c>true</c> if [local rollback only]; otherwise, <c>false</c>.</value>
+ public bool LocalRollbackOnly
+ {
+ get
+ {
+ return _rollbackOnly;
+ }
+ }
+
+ public bool GlobalRollbackOnly
+ {
+ get
+ {
+ return ((_transaction is ISmartTransactionObject) &&
+ ((ISmartTransactionObject) _transaction).RollbackOnly);
+ }
+ }
#region ISavepointManager Members
/// <summary>
|