• 自定义TransactionScope


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    using System.Data.Common;
    using Microsoft.Practices.EnterpriseLibrary.Data;
    using System.Web;
    using System.Threading;

    namespace Customized.Framework.Transaction
    {
        public class CustomizedTransactionScope : IDisposable
        {
            /// <summary>
            
    /// 标志位,标志用户是不是提交了事务
            
    /// </summary>
            private bool isCompleted = false;
            /// <summary>
            
    /// 存放已加入的事务的Connection的
            
    /// </summary>
            private Dictionary<String, ConnAndTran> transactionPool = new Dictionary<string, ConnAndTran>();

            /// <summary>
            
    /// 用来存放WinFrom程序中的事务
            
    /// </summary>
            [ThreadStatic]
            private static CustomizedTransactionScope currentScope;

            /// <summary>
            
    /// 取得当前事务
            
    /// </summary>
            public static CustomizedTransactionScope Current
            {
                get
                {
                    //如果这不是一个Web项目
                    if (HttpContext.Current == null)
                    {
                        return currentScope;
                    }
                    else
                    {
                        //Web项目的话,就把事务标志放到HttpContext中
                        HttpContext context = HttpContext.Current;
                        
                        return context.Items["CurrentTransactionScope"as CustomizedTransactionScope;
                    }
                }
                private set
                {
                    
                    if (HttpContext.Current == null)
                    {
                        currentScope = value;
                    }
                    else
                    {
                        HttpContext context = HttpContext.Current;
                      

                        if (context.Items.Contains("CurrentTransactionScope"))
                            context.Items["CurrentTransactionScope"] = value;
                        else
                            context.Items.Add("CurrentTransactionScope", value);
                       
                    }
                }
            }

            private Guid scopeID = Guid.NewGuid();
            /// <summary>
            
    /// 事务ID
            
    /// </summary>
            public Guid ScopeID
            {
                get
                {
                    return scopeID;
                }
            }

            /// <summary>
            
    /// 构造方法
            
    /// </summary>
            public CustomizedTransactionScope()
            {
                //如果当前没有起动事务,就记下此标志
                if (Current == null)
                {
                    Current = this;
                }
            }

            /// <summary>
            
    /// 调用此方法,将会在代码段结束后提交事务
            
    /// </summary>
            public void Complete()
            {
                //记录用户的提示
                isCompleted = true;
            }

            /// <summary>
            
    /// 加入当前事务
            
    /// </summary>
            
    /// <param name="database"></param>
            
    /// <returns></returns>
            public DbTransaction JoinTransaction(Database database)
            {
                
                if (transactionPool.ContainsKey(database.ConnectionStringWithoutCredentials))
                {
                    return transactionPool[database.ConnectionStringWithoutCredentials].Transaction;
                }
                else
                {

                    DbConnection dbconnection = database.CreateConnection();
                    dbconnection.Open();
                    DbTransaction dbTransaction = dbconnection.BeginTransaction();

                    ConnAndTran Pair = new ConnAndTran();

                    Pair.Connection = dbconnection;
                    Pair.Transaction = dbTransaction;

                    transactionPool.Add(database.ConnectionStringWithoutCredentials, Pair);
                    return Pair.Transaction;

                }
            }

            public override bool Equals(object obj)
            {
                if (obj is CustomizedTransactionScope)
                {
                    CustomizedTransactionScope scope = obj as CustomizedTransactionScope;

                    return (scope.scopeID == this.scopeID);
                }

                return false;

            }

            public override int GetHashCode()
            {
                return scopeID.GetHashCode();
            }

            #region IDisposable 成员
            /// <summary>
            
    /// 销毁资源
            
    /// </summary>
            public void Dispose()
            {

                if (Current == null)
                    return;

                if (Current.scopeID != this.scopeID)
                    return;

                foreach (String connString in transactionPool.Keys)
                {
                    try
                    {
                        //如果用户提交了事务
                        if (isCompleted)
                            transactionPool[connString].Transaction.Commit();
                        else
                            transactionPool[connString].Transaction.Rollback();
                    }
                    finally
                    {
                        //关闭所有的连接
                        DbConnection conn = transactionPool[connString].Connection;

                        if (conn != null && conn.State != System.Data.ConnectionState.Closed)
                            transactionPool[connString].Connection.Close();

                        transactionPool[connString].Transaction.Dispose();
                            
                    }
                }
                //去掉事务标志
                RemoveTransaction();

            }

            #endregion

            private void RemoveTransaction()
            {
                Current = null;
            }
        }

        /// <summary>
        
    /// 放事务和连接类
        
    /// </summary>
        class ConnAndTran
        {
            public DbConnection Connection;
            public DbTransaction Transaction;
        }
    }
  • 相关阅读:
    pyqt 设置QTabWidget标签页不可选
    C#分块读取文本数据(FileStream)
    C#IO读写文本txt文件中的数据
    C#IO读写文本txt文件中的数据
    Winform开发主界面菜单的动态树形列表展示
    Winform开发主界面菜单的动态树形列表展示
    C#LinqJoin两个DataTable
    C#LinqJoin两个DataTable
    c#转义字符
    c#转义字符
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/2740416.html
Copyright © 2020-2023  润新知