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