From: <jul...@us...> - 2010-07-03 14:46:30
|
Revision: 4997 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4997&view=rev Author: julian-maughan Date: 2010-07-03 14:46:23 +0000 (Sat, 03 Jul 2010) Log Message: ----------- Fixed badly named class: AdoNetWithDistrubtedTransactionFactory. Retained original naming for backwards compatibility, but marked as Obsolete. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2010-06-28 12:11:26 UTC (rev 4996) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2010-07-03 14:46:23 UTC (rev 4997) @@ -352,7 +352,7 @@ private static ITransactionFactory CreateTransactionFactory(IDictionary<string, string> properties) { string className = PropertiesHelper.GetString( - Environment.TransactionStrategy, properties, typeof(AdoNetWithDistrubtedTransactionFactory).FullName); + Environment.TransactionStrategy, properties, typeof(AdoNetWithDistributedTransactionFactory).FullName); log.Info("Transaction factory: " + className); try Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-06-28 12:11:26 UTC (rev 4996) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-07-03 14:46:23 UTC (rev 4997) @@ -349,6 +349,7 @@ <Compile Include="StaleObjectStateException.cs" /> <Compile Include="Tool\hbm2ddl\SchemaExport.cs" /> <Compile Include="TransactionException.cs" /> + <Compile Include="Transaction\AdoNetWithDistributedTransactionFactory.cs" /> <Compile Include="Transaction\AdoTransaction.cs" /> <Compile Include="Transaction\ITransactionFactory.cs" /> <Compile Include="Transform\AliasToEntityMapResultTransformer.cs" /> Added: trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs 2010-07-03 14:46:23 UTC (rev 4997) @@ -0,0 +1,175 @@ +using System; +using System.Collections; +using System.Transactions; +using log4net; +using NHibernate.Engine; +using NHibernate.Engine.Transaction; +using NHibernate.Impl; + +namespace NHibernate.Transaction +{ + public class AdoNetWithDistributedTransactionFactory : ITransactionFactory + { + private static readonly ILog logger = LogManager.GetLogger(typeof (AbstractSessionImpl)); + + private readonly AdoNetTransactionFactory adoNetTransactionFactory = new AdoNetTransactionFactory(); + + public void Configure(IDictionary props) + { + } + + public ITransaction CreateTransaction(ISessionImplementor session) + { + return new AdoTransaction(session); + } + + public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) + { + if (session.TransactionContext != null) + return; + + if (System.Transactions.Transaction.Current == null) + return; + + var transactionContext = new DistributedTransactionContext(session, + System.Transactions.Transaction.Current); + session.TransactionContext = transactionContext; + logger.DebugFormat("enlisted into DTC transaction: {0}", + transactionContext.AmbientTransation.IsolationLevel); + session.AfterTransactionBegin(null); + transactionContext.AmbientTransation.TransactionCompleted += + delegate(object sender, TransactionEventArgs e) + { + using (new SessionIdLoggingContext(session.SessionId)) + { + bool wasSuccessful = false; + try + { + wasSuccessful = e.Transaction.TransactionInformation.Status + == TransactionStatus.Committed; + } + catch (ObjectDisposedException ode) + { + logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); + } + session.AfterTransactionCompletion(wasSuccessful, null); + if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) + { + session.CloseSessionFromDistributedTransaction(); + } + session.TransactionContext = null; + } + }; + transactionContext.AmbientTransation.EnlistVolatile(transactionContext, + EnlistmentOptions.EnlistDuringPrepareRequired); + } + + public bool IsInDistributedActiveTransaction(ISessionImplementor session) + { + var distributedTransactionContext = ((DistributedTransactionContext) session.TransactionContext); + return distributedTransactionContext != null && + distributedTransactionContext.IsInActiveTransaction; + } + + public void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted) + { + using(var tx = new TransactionScope(TransactionScopeOption.Suppress)) + { + // instead of duplicating the logic, we suppress the DTC transaction and create + // our own transaction instead + adoNetTransactionFactory.ExecuteWorkInIsolation(session, work, transacted); + tx.Complete(); + } + } + + public class DistributedTransactionContext : ITransactionContext, IEnlistmentNotification + { + public System.Transactions.Transaction AmbientTransation { get; set; } + public bool ShouldCloseSessionOnDistributedTransactionCompleted { get; set; } + private readonly ISessionImplementor sessionImplementor; + public bool IsInActiveTransaction; + + public DistributedTransactionContext(ISessionImplementor sessionImplementor, System.Transactions.Transaction transaction) + { + this.sessionImplementor = sessionImplementor; + AmbientTransation = transaction.Clone(); + IsInActiveTransaction = true; + } + + #region IEnlistmentNotification Members + + void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + try + { + using (var tx = new TransactionScope(AmbientTransation)) + { + sessionImplementor.BeforeTransactionCompletion(null); + if (sessionImplementor.FlushMode != FlushMode.Never && sessionImplementor.ConnectionManager.IsConnected) + { + using (sessionImplementor.ConnectionManager.FlushingFromDtcTransaction) + { + logger.Debug(string.Format("[session-id={0}] Flushing from Dtc Transaction", sessionImplementor.SessionId)); + sessionImplementor.Flush(); + } + } + logger.Debug("prepared for DTC transaction"); + + tx.Complete(); + } + preparingEnlistment.Prepared(); + } + catch (Exception exception) + { + logger.Error("DTC transaction prepre phase failed", exception); + preparingEnlistment.ForceRollback(exception); + } + } + } + + void IEnlistmentNotification.Commit(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + logger.Debug("committing DTC transaction"); + // we have nothing to do here, since it is the actual + // DB connection that will commit the transaction + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + void IEnlistmentNotification.Rollback(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + sessionImplementor.AfterTransactionCompletion(false, null); + logger.Debug("rolled back DTC transaction"); + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + void IEnlistmentNotification.InDoubt(Enlistment enlistment) + { + using (new SessionIdLoggingContext(sessionImplementor.SessionId)) + { + sessionImplementor.AfterTransactionCompletion(false, null); + logger.Debug("DTC transaction is in doubt"); + enlistment.Done(); + IsInActiveTransaction = false; + } + } + + #endregion + + public void Dispose() + { + if (AmbientTransation != null) + AmbientTransation.Dispose(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2010-06-28 12:11:26 UTC (rev 4996) +++ trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistrubtedTransactionFactory.cs 2010-07-03 14:46:23 UTC (rev 4997) @@ -1,175 +1,9 @@ using System; -using System.Collections; -using System.Transactions; -using log4net; -using NHibernate.Engine; -using NHibernate.Engine.Transaction; -using NHibernate.Impl; namespace NHibernate.Transaction { - public class AdoNetWithDistrubtedTransactionFactory : ITransactionFactory + [Obsolete("Use renamed class: AdoNetWithDistributedTransactionFactory")] + public class AdoNetWithDistrubtedTransactionFactory : AdoNetWithDistributedTransactionFactory { - private static readonly ILog logger = LogManager.GetLogger(typeof (AbstractSessionImpl)); - private readonly AdoNetTransactionFactory adoNetTransactionFactory = new AdoNetTransactionFactory(); - - - public void Configure(IDictionary props) - { - - } - - public ITransaction CreateTransaction(ISessionImplementor session) - { - return new AdoTransaction(session); - } - - public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) - { - if (session.TransactionContext != null) - return; - if (System.Transactions.Transaction.Current == null) - return; - var transactionContext = new DistributedTransactionContext(session, - System.Transactions.Transaction.Current); - session.TransactionContext = transactionContext; - logger.DebugFormat("enlisted into DTC transaction: {0}", - transactionContext.AmbientTransation.IsolationLevel); - session.AfterTransactionBegin(null); - transactionContext.AmbientTransation.TransactionCompleted += - delegate(object sender, TransactionEventArgs e) - { - using (new SessionIdLoggingContext(session.SessionId)) - { - bool wasSuccessful = false; - try - { - wasSuccessful = e.Transaction.TransactionInformation.Status - == TransactionStatus.Committed; - } - catch (ObjectDisposedException ode) - { - logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); - } - session.AfterTransactionCompletion(wasSuccessful, null); - if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) - { - session.CloseSessionFromDistributedTransaction(); - } - session.TransactionContext = null; - } - }; - transactionContext.AmbientTransation.EnlistVolatile(transactionContext, - EnlistmentOptions.EnlistDuringPrepareRequired); - - } - - public bool IsInDistributedActiveTransaction(ISessionImplementor session) - { - var distributedTransactionContext = ((DistributedTransactionContext) session.TransactionContext); - return distributedTransactionContext != null && - distributedTransactionContext.IsInActiveTransaction; - } - - public void ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, bool transacted) - { - using(var tx = new TransactionScope(TransactionScopeOption.Suppress)) - { - // instead of duplicating the logic, we suppress the DTC transaction and create - // our own transaction instead - adoNetTransactionFactory.ExecuteWorkInIsolation(session, work, transacted); - tx.Complete(); - } - } - - public class DistributedTransactionContext : ITransactionContext, IEnlistmentNotification - { - public System.Transactions.Transaction AmbientTransation { get; set; } - public bool ShouldCloseSessionOnDistributedTransactionCompleted { get; set; } - private readonly ISessionImplementor sessionImplementor; - public bool IsInActiveTransaction; - - public DistributedTransactionContext(ISessionImplementor sessionImplementor, System.Transactions.Transaction transaction) - { - this.sessionImplementor = sessionImplementor; - AmbientTransation = transaction.Clone(); - IsInActiveTransaction = true; - } - - #region IEnlistmentNotification Members - - void IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment) - { - using (new SessionIdLoggingContext(sessionImplementor.SessionId)) - { - try - { - using (var tx = new TransactionScope(AmbientTransation)) - { - sessionImplementor.BeforeTransactionCompletion(null); - if (sessionImplementor.FlushMode != FlushMode.Never && sessionImplementor.ConnectionManager.IsConnected) - { - using (sessionImplementor.ConnectionManager.FlushingFromDtcTransaction) - { - logger.Debug(string.Format("[session-id={0}] Flushing from Dtc Transaction", sessionImplementor.SessionId)); - sessionImplementor.Flush(); - } - } - logger.Debug("prepared for DTC transaction"); - - tx.Complete(); - } - preparingEnlistment.Prepared(); - } - catch (Exception exception) - { - logger.Error("DTC transaction prepre phase failed", exception); - preparingEnlistment.ForceRollback(exception); - } - } - } - - void IEnlistmentNotification.Commit(Enlistment enlistment) - { - using (new SessionIdLoggingContext(sessionImplementor.SessionId)) - { - logger.Debug("committing DTC transaction"); - // we have nothing to do here, since it is the actual - // DB connection that will commit the transaction - enlistment.Done(); - IsInActiveTransaction = false; - } - } - - void IEnlistmentNotification.Rollback(Enlistment enlistment) - { - using (new SessionIdLoggingContext(sessionImplementor.SessionId)) - { - sessionImplementor.AfterTransactionCompletion(false, null); - logger.Debug("rolled back DTC transaction"); - enlistment.Done(); - IsInActiveTransaction = false; - } - } - - void IEnlistmentNotification.InDoubt(Enlistment enlistment) - { - using (new SessionIdLoggingContext(sessionImplementor.SessionId)) - { - sessionImplementor.AfterTransactionCompletion(false, null); - logger.Debug("DTC transaction is in doubt"); - enlistment.Done(); - IsInActiveTransaction = false; - } - } - - #endregion - - public void Dispose() - { - if (AmbientTransation != null) - AmbientTransation.Dispose(); - } - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs 2010-06-28 12:11:26 UTC (rev 4996) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1054/NH1054Fixture.cs 2010-07-03 14:46:23 UTC (rev 4997) @@ -27,7 +27,7 @@ Configuration configuration = new Configuration(); ISessionFactoryImplementor sessionFactory = (ISessionFactoryImplementor)configuration.BuildSessionFactory(); - Assert.IsInstanceOfType(typeof(NHibernate.Transaction.AdoNetWithDistrubtedTransactionFactory), + Assert.IsInstanceOfType(typeof(NHibernate.Transaction.AdoNetWithDistributedTransactionFactory), sessionFactory.Settings.TransactionFactory); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |