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); } }