|
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.
|