public void BeginTransaction(IsolationLevel?isolationLevel) { if (TransactionCurrentThread != null) { return; } int tid = Thread.CurrentThread.ManagedThreadId; Transaction2 tran = null; Object <DbConnection> conn = null; var before = new Aop.TraceBeforeEventArgs("ThreadTransaction", isolationLevel); _util?._orm?.Aop.TraceBeforeHandler?.Invoke(this, before); try { conn = MasterPool.Get(); tran = new Transaction2(conn, isolationLevel == null ? conn.Value.BeginTransaction() : conn.Value.BeginTransaction(isolationLevel.Value), TimeSpan.FromSeconds(60)); tran.AopBefore = before; } catch (Exception ex) { Trace.WriteLine($"数据库出错(开启事务){ex.Message} \r\n{ex.StackTrace}"); MasterPool.Return(conn); var after = new Aop.TraceAfterEventArgs(before, "", ex); _util?._orm?.Aop.TraceAfterHandler?.Invoke(this, after); throw ex; } if (_trans.ContainsKey(tid)) { CommitTransaction(); } _trans.TryAdd(tid, tran); }
public void BeginTransaction(TimeSpan timeout) { if (TransactionCurrentThread != null) { return; } int tid = Thread.CurrentThread.ManagedThreadId; Transaction2 tran = null; Object <DbConnection> conn = null; try { conn = MasterPool.Get(); tran = new Transaction2(conn, conn.Value.BeginTransaction(), timeout); } catch (Exception ex) { _log.LogError($"数据库出错(开启事务){ex.Message} \r\n{ex.StackTrace}"); MasterPool.Return(conn); throw ex; } if (_trans.ContainsKey(tid)) { CommitTransaction(); } lock (_trans_lock) _trans.Add(tid, tran); }
private void CommitTransaction(bool isCommit, Transaction2 tran) { if (tran == null || tran.Transaction == null || tran.Transaction.Connection == null) { return; } if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { lock (_trans_lock) if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { _trans.Remove(tran.Conn.LastGetThreadId); } } var removeKeys = PreRemove(); if (_preRemoveKeys.ContainsKey(tran.Conn.LastGetThreadId)) { lock (_preRemoveKeys_lock) if (_preRemoveKeys.ContainsKey(tran.Conn.LastGetThreadId)) { _preRemoveKeys.Remove(tran.Conn.LastGetThreadId); } } Exception ex = null; var f001 = isCommit ? "提交" : "回滚"; try { _log.LogDebug($"线程{tran.Conn.LastGetThreadId}事务{f001},批量删除缓存key {Newtonsoft.Json.JsonConvert.SerializeObject(removeKeys)}"); _cache.Remove(removeKeys); if (isCommit) { tran.Transaction.Commit(); } else { tran.Transaction.Rollback(); } } catch (Exception ex2) { ex = ex2; _log.LogError($"数据库出错({f001}事务):{ex.Message} {ex.StackTrace}"); } finally { ReturnConnection(MasterPool, tran.Conn, ex); //MasterPool.Return(tran.Conn, ex); } }
private void CommitTransaction(bool isCommit, Transaction2 tran, Exception rollbackException, string remark = null) { if (tran == null || tran.Transaction == null || tran.Transaction.Connection == null) { return; } if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { lock (_trans_lock) if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { _trans.TryRemove(tran.Conn.LastGetThreadId, out var oldtran); } } Exception ex = null; if (string.IsNullOrEmpty(remark)) { remark = isCommit ? "提交" : "回滚"; } try { Trace.WriteLine($"线程{tran.Conn.LastGetThreadId}事务{remark}"); if (isCommit) { tran.Transaction.Commit(); } else { tran.Transaction.Rollback(); } } catch (Exception ex2) { ex = ex2; Trace.WriteLine($"数据库出错({remark}事务):{ex.Message} {ex.StackTrace}"); } finally { ReturnConnection(MasterPool, tran.Conn, ex); //MasterPool.Return(tran.Conn, ex); var after = new Aop.TraceAfterEventArgs(tran.AopBefore, remark, ex ?? rollbackException); _util?._orm?.Aop.TraceAfterHandler?.Invoke(this, after); } }
private void CommitTransaction(bool isCommit, Transaction2 tran) { if (tran == null || tran.Transaction == null || tran.Transaction.Connection == null) { return; } if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { lock (_trans_lock) if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) { _trans.TryRemove(tran.Conn.LastGetThreadId, out var oldtran); } } Exception ex = null; var f001 = isCommit ? "提交" : "回滚"; try { Trace.WriteLine($"线程{tran.Conn.LastGetThreadId}事务{f001}"); if (isCommit) { tran.Transaction.Commit(); } else { tran.Transaction.Rollback(); } } catch (Exception ex2) { ex = ex2; Trace.WriteLine($"数据库出错({f001}事务):{ex.Message} {ex.StackTrace}"); } finally { ReturnConnection(MasterPool, tran.Conn, ex); //MasterPool.Return(tran.Conn, ex); } }