Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv12831/Data/Core
Modified Files:
ServiceDomainPlatformTransactionManager.cs
Log Message:
SPRNET-773 - ServiceDomainTransactionManager dev
Index: ServiceDomainPlatformTransactionManager.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core/ServiceDomainPlatformTransactionManager.cs,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** ServiceDomainPlatformTransactionManager.cs 3 Aug 2007 19:51:11 -0000 1.1
--- ServiceDomainPlatformTransactionManager.cs 30 Nov 2007 22:00:19 -0000 1.2
***************
*** 26,29 ****
--- 26,30 ----
using System.EnterpriseServices;
using System.Threading;
+ using Spring.Data.Support;
using Spring.Objects.Factory;
using Spring.Transaction;
***************
*** 61,65 ****
protected override object DoGetTransaction()
{
! return new Object();//ServiceDomainTransactionObject();
}
--- 62,66 ----
protected override object DoGetTransaction()
{
! return new ServiceDomainTransactionObject();
}
***************
*** 68,74 ****
protected override bool IsExistingTransaction(object transaction)
{
! //ServiceDomainTransactionObject txObject =
! // (ServiceDomainTransactionObject)transaction;
! if (ContextUtil.IsInTransaction)
{
return true;
--- 69,74 ----
protected override bool IsExistingTransaction(object transaction)
{
! ServiceDomainTransactionObject txObject = (ServiceDomainTransactionObject)transaction;
! if (txObject.ServiceDomainAdapter.IsInTransaction)
{
return true;
***************
*** 82,93 ****
protected override void DoBegin(object transaction, ITransactionDefinition definition)
{
- //ServiceDomainTransactionObject txObject =
- // (ServiceDomainTransactionObject)transaction;
try
{
! DoServiceDomainBegin(definition);
}
- // TODO - may want to catch some exceptions here to map into DAO
- // exception hierarchy.
catch (Exception e)
{
--- 82,95 ----
protected override void DoBegin(object transaction, ITransactionDefinition definition)
{
try
{
! ServiceDomainTransactionObject txObject = (ServiceDomainTransactionObject)transaction;
!
! DoServiceDomainBegin(txObject, definition);
! }
! catch (PlatformNotSupportedException ex)
! {
! throw new TransactionSystemException("ServiceDomain failure on begin of transaction. Platform does not support EnterpriseServices 'Services without Components'", ex);
}
catch (Exception e)
{
***************
*** 96,108 ****
}
! private void DoServiceDomainBegin(ITransactionDefinition definition)
{
-
-
- //TODO investigate keeping track of how many contexts created....
ServiceConfig serviceConfig = CreateServiceConfig(definition);
-
//The context is created when we call Enter.
! ServiceDomain.Enter(serviceConfig);
if (log.IsDebugEnabled)
{
--- 98,106 ----
}
! private void DoServiceDomainBegin(ServiceDomainTransactionObject serviceDomainTxObject, ITransactionDefinition definition)
{
ServiceConfig serviceConfig = CreateServiceConfig(definition);
//The context is created when we call Enter.
! serviceDomainTxObject.ServiceDomainAdapter.Enter(serviceConfig);
if (log.IsDebugEnabled)
{
***************
*** 110,118 ****
+ ", ActivityId = " + ContextUtil.ActivityId);
}
!
!
!
}
--- 108,124 ----
+ ", ActivityId = " + ContextUtil.ActivityId);
}
+ }
+ protected override object DoSuspend(object transaction)
+ {
+ // Passing the current transaction object, literally an 'object' as the 'suspended resource',
+ // even though it is not used just to avoid passing null
+ // ServiceDomainPlatformTransactionManager is not binding any resources to the local thread, instead delegating to
+ // System.EnterpriseServices to handle thread local resources.
+ return transaction;
+ }
! protected override void DoResume(object transaction, object suspendedResources)
! {
}
***************
*** 129,133 ****
serviceConfig.TrackingComponentName = "ServiceDomainPlatformTransactionManager";
! #region Apply PropagationBehavior
if (definition.PropagationBehavior == TransactionPropagation.Required)
{
--- 135,190 ----
serviceConfig.TrackingComponentName = "ServiceDomainPlatformTransactionManager";
! ApplyPropagationBehavior(serviceConfig, definition);
!
! ApplyIsolationLevel(serviceConfig, definition);
!
! // infinite==-1 would cause transactions to be aborted immediately!
! if(definition.TransactionTimeout != Timeout.Infinite)
! {
! serviceConfig.TransactionTimeout = definition.TransactionTimeout;
! }
! return serviceConfig;
! }
!
! protected void ApplyIsolationLevel(ServiceConfig serviceConfig, ITransactionDefinition definition)
! {
! switch (definition.TransactionIsolationLevel)
! {
!
! case System.Data.IsolationLevel.Chaos:
! if (log.IsInfoEnabled)
! {
! log.Info("IsolationLevel Chaos does not have a direct counterpart in EnterpriseServices, using Any");
! }
! serviceConfig.IsolationLevel = TransactionIsolationLevel.Any;
! break;
! case System.Data.IsolationLevel.ReadCommitted:
! serviceConfig.IsolationLevel = TransactionIsolationLevel.ReadCommitted;
! break;
! case System.Data.IsolationLevel.ReadUncommitted:
! serviceConfig.IsolationLevel = TransactionIsolationLevel.ReadUncommitted;
! break;
! case System.Data.IsolationLevel.RepeatableRead:
! serviceConfig.IsolationLevel = TransactionIsolationLevel.RepeatableRead;
! break;
! case System.Data.IsolationLevel.Serializable:
! serviceConfig.IsolationLevel = TransactionIsolationLevel.Serializable;
! break;
! case System.Data.IsolationLevel.Snapshot:
! if (log.IsInfoEnabled)
! {
! log.Info("IsolationLevel Snapshot does not have a direct counterpart in EnterpriseServices, using ReadUncommitted");
! }
! serviceConfig.IsolationLevel = TransactionIsolationLevel.ReadUncommitted;
! break;
! case System.Data.IsolationLevel.Unspecified:
! serviceConfig.IsolationLevel = TransactionIsolationLevel.Any;
! break;
! }
!
! }
!
! protected void ApplyPropagationBehavior(ServiceConfig serviceConfig, ITransactionDefinition definition)
! {
if (definition.PropagationBehavior == TransactionPropagation.Required)
{
***************
*** 157,223 ****
"Defaulting to Never(Disabled) ");
}
- #endregion
- //TODO apply isoation level
- serviceConfig.IsolationLevel = (TransactionIsolationLevel)Enum.Parse(typeof(TransactionIsolationLevel), "" + definition.TransactionIsolationLevel);
- // infinite==-1 would cause transactions to be aborted immediately!
- if(definition.TransactionTimeout != Timeout.Infinite)
- {
- serviceConfig.TransactionTimeout = definition.TransactionTimeout;
- }
- return serviceConfig;
}
- protected override object DoSuspend(object transaction)
- {
- throw new NotImplementedException("The DoSuspend method is not implemented.");
- }
- protected override void DoResume(object transaction, object suspendedResources)
- {
- throw new NotImplementedException("The DoResume mehtod is not implemented.");
- }
protected override void DoCommit(DefaultTransactionStatus status)
{
try
{
! ContextUtil.SetComplete();
! //TODO investigate only calling leave only the 'root', i.e. first context created.
! TransactionStatus serviceDomainTxstatus =
! ServiceDomain.Leave();
! log.Info("ServiceDomain Transaction Status upon leaving ServiceDomain = " + serviceDomainTxstatus);
}
catch (Exception e)
{
! throw new TransactionSystemException("Failure upon Leaving ServiceDomain (i.e. Commit)" , e);
}
}
protected override void DoRollback(DefaultTransactionStatus status)
{
! ContextUtil.SetAbort();
}
protected override void DoSetRollbackOnly(DefaultTransactionStatus status)
{
! throw new NotImplementedException("The DoSetRollbackOnly method is not implemented.");
}
! public class ServiceDomainTransactionObjectNotUsed
{
! private ServiceDomain serviceDomain;
! public ServiceDomain ServiceDomain
{
get
{
! return serviceDomain;
! }
! set
! {
! serviceDomain = value;
}
}
--- 214,338 ----
"Defaulting to Never(Disabled) ");
}
}
protected override void DoCommit(DefaultTransactionStatus status)
{
+ ServiceDomainTransactionObject txObject = (ServiceDomainTransactionObject) status.Transaction;
+ bool globalRollbackOnly = status.GlobalRollbackOnly;
try
{
! if (txObject.ServiceDomainAdapter.IsInTransaction)
! {
! if (txObject.ServiceDomainAdapter.MyTransactionVote == TransactionVote.Commit)
! {
! txObject.ServiceDomainAdapter.SetComplete();
! }
! else
! {
! txObject.ServiceDomainAdapter.SetAbort();
! }
! }
! TransactionStatus serviceDomainTxstatus = txObject.ServiceDomainAdapter.Leave();
! if (log.IsDebugEnabled)
! {
! log.Debug("ServiceDomain Transaction Status upon leaving ServiceDomain = " + serviceDomainTxstatus);
! }
! txObject.TransactionStatus = serviceDomainTxstatus;
! if (!globalRollbackOnly && serviceDomainTxstatus == TransactionStatus.Aborted)
! {
! throw new UnexpectedRollbackException("Transaction unexpectedly rolled-back (maybe due to a timeout)");
! }
! }
! catch (PlatformNotSupportedException ex)
! {
! throw new TransactionSystemException("Failure on Commit. Platform does not support EnterpriseServices 'Services without Components'", ex);
}
catch (Exception e)
{
! throw new TransactionSystemException("Failure upon Leaving ServiceDomain (i.e. Commit)", e);
}
+
}
protected override void DoRollback(DefaultTransactionStatus status)
{
! ServiceDomainTransactionObject txObject = (ServiceDomainTransactionObject)status.Transaction;
! if (txObject.ServiceDomainAdapter.IsInTransaction)
! {
! try
! {
! txObject.ServiceDomainAdapter.SetAbort();
! txObject.ServiceDomainAdapter.Leave();
! }
! catch (Exception e)
! {
! throw new Spring.Transaction.TransactionSystemException("Failure on Transaction Scope rollback.", e);
! }
! }
}
protected override void DoSetRollbackOnly(DefaultTransactionStatus status)
{
! ServiceDomainTransactionObject txObject = (ServiceDomainTransactionObject)status.Transaction;
! if (status.Debug)
! {
! log.Debug("Setting transaction rollback-only");
! }
! try
! {
! txObject.ServiceDomainAdapter.MyTransactionVote = TransactionVote.Abort;
! }
! catch (Exception ex)
! {
! throw new TransactionSystemException("Failure on System.Transactions.Transaction.Current.Rollback", ex);
! }
!
}
+ protected override bool ShouldCommitOnGlobalRollbackOnly
+ {
+ get { return true; }
+ }
!
! public class ServiceDomainTransactionObject : ISmartTransactionObject
{
! private TransactionStatus transactionStatus;
! private IServiceDomainAdapter serviceDomainAdapter;
!
! public ServiceDomainTransactionObject()
! {
! serviceDomainAdapter = new DefaultServiceDomainAdapter();
! }
!
! public IServiceDomainAdapter ServiceDomainAdapter
! {
! get { return serviceDomainAdapter; }
! set { serviceDomainAdapter = value; }
! }
!
! public TransactionStatus TransactionStatus
! {
! get { return transactionStatus; }
! set { transactionStatus = value; }
! }
!
! public bool RollbackOnly
{
get
{
! if ( ContextUtil.MyTransactionVote == TransactionVote.Abort)
! {
! return true;
! }
! else
! {
! return false;
! }
}
}
|