public static void Enlist(IDbCommand cmd, string connectionString, ConnectionDelegate connection) { TransactionScope scope = TransactionScope.GetCurrentTx(); if (scope == null) { cmd.Connection = connection(); cmd.Connection.ConnectionString = connectionString; cmd.Connection.Open(); } else { TransactionScope.Transaction transaction = scope.transactions[connectionString] as TransactionScope.Transaction; if (transaction == null) { //transaction = new TransactionScope.Transaction(); IDbConnection conn = connection(); conn.ConnectionString = connectionString; conn.Open(); transaction = new TransactionScope.Transaction(conn);// This is Roee's Bug Fix if (TransactionScope._isolationLevel != IsolationLevel.Unspecified) { transaction.sqlTx = conn.BeginTransaction(TransactionScope._isolationLevel); } else { transaction.sqlTx = conn.BeginTransaction(); } scope.transactions[connectionString] = transaction; } //cmd.Connection = transaction.sqlTx.Connection; cmd.Connection = transaction.connectionReference; // This is Roee's Bug Fix cmd.Transaction = transaction.sqlTx; } }
/// <summary> /// Returns false if connection is resused, otherwise true. Make sure to close connection in that case. /// </summary> /// <param name="cmd"></param> /// <param name="connectionString"></param> /// <param name="connection"></param> /// <returns></returns> public static bool OpenConnection(IDbCommand cmd, string connectionString, ConnectionDelegate connection) { TransactionScope scope = TransactionScope.GetCurrentTx(); if (scope == null) { cmd.Connection = connection(); cmd.Connection.ConnectionString = connectionString; cmd.Connection.Open(); return(true); } else { TransactionScope.Transaction transaction = scope.transactions[connectionString] as TransactionScope.Transaction; if (transaction == null) { cmd.Connection = connection(); cmd.Connection.ConnectionString = connectionString; cmd.Connection.Open(); return(true); } else { cmd.Connection = transaction.sqlTx.Connection; cmd.Transaction = transaction.sqlTx; return(false); } } }