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); }
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); }
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)}"); CacheRemove(removeKeys); if (isCommit) { tran.Transaction.Commit(); } else { tran.Transaction.Rollback(); } } catch (Exception ex2) { ex = ex2; Log.LogError($"数据库出错({f001}事务):{ex.Message} {ex.StackTrace}"); } finally { MasterPool.Return(tran.Conn, ex); } }