/// <summary> /// 重写获取当前事物所使用的数据连接的函数 /// </summary> /// <param name="ts">事物对象</param> /// <returns>数据连接</returns> protected override DbConnection OnGetConnectionWithTransaction(Transaction ts) { Connections connections = null; GraphWithTransaction graph = AutoEnlistDbContext.GraphWithTx; lock (graph) { // current transaction exists only in current HttpContext or Thread if (graph.TryGetValue(ts, out connections) == false) { connections = new Connections(); graph.Add(Transaction.Current, connections); } } ReferenceConnection resultConnection = null; DoSafeConnectionOp(this.Name, connections, (refConnection) => { refConnection.ReferenceCount++; resultConnection = refConnection; }, () => { resultConnection = new ReferenceConnection(this.Name, DbConnectionManager.GetConnection(this.Name)); IsConnectionCreator = true; connections.Add(this.Name, resultConnection); }); return(resultConnection.Connection); }
protected override void OnTransactionCompleted(TransactionEventArgs args) { GraphWithTransaction graph = GraphWithTx; lock (graph) { DbTransactions transactions; if (graph.TryGetValue(args.Transaction, out transactions)) { try { lock (transactions) { foreach (KeyValuePair <ReferenceConnection, DbTransaction> item in transactions) { if (args.Transaction.TransactionInformation.Status == TransactionStatus.Committed) { item.Value.Commit(); } else { item.Value.Rollback(); } ReferenceConnection refConnection = item.Key; if (refConnection.ReferenceCount == 0) { try { refConnection.Connection.Close(); } finally { GraphWithoutTx.Remove(refConnection.Name); } } WriteTraceInfo(refConnection.Connection.DataSource + "." + refConnection.Connection.Database + "[" + DateTime.Now.ToString("yyyyMMdd HH:mm:ss.fff") + "]", " Close Connection "); } } } finally { graph.Remove(args.Transaction); } } } }
/// <summary> /// 数据库事务结束时触发的事件 /// </summary> /// <param name="args">事件对象</param> protected override void OnTransactionCompleted(TransactionEventArgs args) { GraphWithTransaction graph = GraphWithTx; lock (graph) { Connections connections; if (graph.TryGetValue(args.Transaction, out connections)) { try { lock (connections) { foreach (KeyValuePair <string, ReferenceConnection> item in connections) { DbConnection connection = item.Value.Connection; if (connection.State != ConnectionState.Closed) { connection.Close(); WriteTraceInfo(connection.DataSource + "." + connection.Database + "[" + SNTPClient.AdjustedTime.ToString("yyyyMMdd HH:mm:ss.fff") + "]", " Close Connection "); } } } } finally { graph.Remove(args.Transaction); } } } }