diff --git a/src/NHibernate/Async/Transaction/AdoNetTransactionFactory.cs b/src/NHibernate/Async/Transaction/AdoNetTransactionFactory.cs
index ec3ea6bc578..76466173109 100644
--- a/src/NHibernate/Async/Transaction/AdoNetTransactionFactory.cs
+++ b/src/NHibernate/Async/Transaction/AdoNetTransactionFactory.cs
@@ -16,7 +16,6 @@
using NHibernate.Engine;
using NHibernate.Engine.Transaction;
using NHibernate.Exceptions;
-using NHibernate.Impl;
namespace NHibernate.Transaction
{
@@ -42,25 +41,17 @@ async Task InternalExecuteWorkInIsolationAsync()
DbConnection connection = null;
DbTransaction trans = null;
- // bool wasAutoCommit = false;
try
{
// We make an exception for SQLite and use the session's connection,
// since SQLite only allows one connection to the database.
- if (session.Factory.Dialect is SQLiteDialect)
- connection = session.Connection;
- else
- connection = await (session.Factory.ConnectionProvider.GetConnectionAsync(cancellationToken)).ConfigureAwait(false);
+ connection = session.Factory.Dialect is SQLiteDialect
+ ? session.Connection
+ : await (session.Factory.ConnectionProvider.GetConnectionAsync(cancellationToken)).ConfigureAwait(false);
if (transacted)
{
trans = connection.BeginTransaction();
- // TODO NH: a way to read the autocommit state is needed
- //if (TransactionManager.GetAutoCommit(connection))
- //{
- // wasAutoCommit = true;
- // TransactionManager.SetAutoCommit(connection, false);
- //}
}
await (work.DoWorkAsync(connection, trans, cancellationToken)).ConfigureAwait(false);
@@ -68,7 +59,6 @@ async Task InternalExecuteWorkInIsolationAsync()
if (transacted)
{
trans.Commit();
- //TransactionManager.Commit(connection);
}
}
catch (Exception t)
@@ -84,49 +74,33 @@ async Task InternalExecuteWorkInIsolationAsync()
}
catch (Exception ignore)
{
- isolaterLog.Debug(ignore, "Unable to rollback transaction");
+ _isolatorLog.Debug(ignore, "Unable to rollback transaction");
}
- if (t is HibernateException)
- {
- throw;
- }
- else if (t is DbException)
- {
- throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t,
- "error performing isolated work");
- }
- else
- {
- throw new HibernateException("error performing isolated work", t);
- }
+ switch (t)
+ {
+ case HibernateException _:
+ throw;
+ case DbException _:
+ throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t,
+ "error performing isolated work");
+ default:
+ throw new HibernateException("error performing isolated work", t);
+ }
}
}
finally
{
- //if (transacted && wasAutoCommit)
- //{
- // try
- // {
- // // TODO NH: reset autocommit
- // // TransactionManager.SetAutoCommit(connection, true);
- // }
- // catch (Exception)
- // {
- // log.Debug("was unable to reset connection back to auto-commit");
- // }
- //}
-
try
{
trans?.Dispose();
}
catch (Exception ignore)
{
- isolaterLog.Warn(ignore, "Unable to dispose transaction");
+ _isolatorLog.Warn(ignore, "Unable to dispose transaction");
}
- if (session.Factory.Dialect is SQLiteDialect == false)
+ if (connection != null && session.Factory.Dialect is SQLiteDialect == false)
session.Factory.ConnectionProvider.CloseConnection(connection);
}
}
diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs
index a49012c1262..e30c2fdf21d 100644
--- a/src/NHibernate/Connection/ConnectionProvider.cs
+++ b/src/NHibernate/Connection/ConnectionProvider.cs
@@ -24,6 +24,9 @@ public abstract partial class ConnectionProvider : IConnectionProvider
/// The to clean up.
public virtual void CloseConnection(DbConnection conn)
{
+ if (conn == null)
+ throw new ArgumentNullException(nameof(conn));
+
log.Debug("Closing connection");
try
{
diff --git a/src/NHibernate/Transaction/AdoNetTransactionFactory.cs b/src/NHibernate/Transaction/AdoNetTransactionFactory.cs
index e1d485aeecb..5fe50f06757 100644
--- a/src/NHibernate/Transaction/AdoNetTransactionFactory.cs
+++ b/src/NHibernate/Transaction/AdoNetTransactionFactory.cs
@@ -6,7 +6,6 @@
using NHibernate.Engine;
using NHibernate.Engine.Transaction;
using NHibernate.Exceptions;
-using NHibernate.Impl;
namespace NHibernate.Transaction
{
@@ -16,7 +15,7 @@ namespace NHibernate.Transaction
///
public partial class AdoNetTransactionFactory : ITransactionFactory
{
- private readonly INHibernateLogger isolaterLog = NHibernateLogger.For(typeof(ITransactionFactory));
+ private static readonly INHibernateLogger _isolatorLog = NHibernateLogger.For(typeof(ITransactionFactory));
///
public virtual ITransaction CreateTransaction(ISessionImplementor session)
@@ -52,25 +51,17 @@ public virtual void ExecuteWorkInIsolation(ISessionImplementor session, IIsolate
DbConnection connection = null;
DbTransaction trans = null;
- // bool wasAutoCommit = false;
try
{
// We make an exception for SQLite and use the session's connection,
// since SQLite only allows one connection to the database.
- if (session.Factory.Dialect is SQLiteDialect)
- connection = session.Connection;
- else
- connection = session.Factory.ConnectionProvider.GetConnection();
+ connection = session.Factory.Dialect is SQLiteDialect
+ ? session.Connection
+ : session.Factory.ConnectionProvider.GetConnection();
if (transacted)
{
trans = connection.BeginTransaction();
- // TODO NH: a way to read the autocommit state is needed
- //if (TransactionManager.GetAutoCommit(connection))
- //{
- // wasAutoCommit = true;
- // TransactionManager.SetAutoCommit(connection, false);
- //}
}
work.DoWork(connection, trans);
@@ -78,7 +69,6 @@ public virtual void ExecuteWorkInIsolation(ISessionImplementor session, IIsolate
if (transacted)
{
trans.Commit();
- //TransactionManager.Commit(connection);
}
}
catch (Exception t)
@@ -94,49 +84,33 @@ public virtual void ExecuteWorkInIsolation(ISessionImplementor session, IIsolate
}
catch (Exception ignore)
{
- isolaterLog.Debug(ignore, "Unable to rollback transaction");
+ _isolatorLog.Debug(ignore, "Unable to rollback transaction");
}
- if (t is HibernateException)
+ switch (t)
{
- throw;
- }
- else if (t is DbException)
- {
- throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t,
- "error performing isolated work");
- }
- else
- {
- throw new HibernateException("error performing isolated work", t);
+ case HibernateException _:
+ throw;
+ case DbException _:
+ throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, t,
+ "error performing isolated work");
+ default:
+ throw new HibernateException("error performing isolated work", t);
}
}
}
finally
{
- //if (transacted && wasAutoCommit)
- //{
- // try
- // {
- // // TODO NH: reset autocommit
- // // TransactionManager.SetAutoCommit(connection, true);
- // }
- // catch (Exception)
- // {
- // log.Debug("was unable to reset connection back to auto-commit");
- // }
- //}
-
try
{
trans?.Dispose();
}
catch (Exception ignore)
{
- isolaterLog.Warn(ignore, "Unable to dispose transaction");
+ _isolatorLog.Warn(ignore, "Unable to dispose transaction");
}
- if (session.Factory.Dialect is SQLiteDialect == false)
+ if (connection != null && session.Factory.Dialect is SQLiteDialect == false)
session.Factory.ConnectionProvider.CloseConnection(connection);
}
}