asp.net IBatisNet事务,支持事务嵌套

来源:互联网 发布:风水罗盘指南针软件 编辑:程序博客网 时间:2024/06/06 15:37
    /// <summary>
    /// IBatis事务,支持事务嵌套
    /// </summary>
    public class IBatisTransaction
    {
        static private object _syn = new object();//控制多线程并发
        static private Dictionary<Thread, int> _SessionList = new Dictionary<Thread, int>();//保存运行事务的线程,int 表示某一个线程执行多级事务的数量,即:两个方法中都有事务存在


        /// <summary>
        /// 开始事务
        /// </summary>
        /// <param name="callObj">调用对象,一般为this</param>
        public static void BeginTransaction(object callObj)
        {
            ISqlMapper daoManager = ServiceConfig.GetInstance().DaoManager;
            Thread thread = Thread.CurrentThread;
            lock (_syn)
            {
                if (_SessionList.ContainsKey(thread))//当前线程已经存在事务标识中就不开启第二层事务
                {
                    _SessionList[thread]++;//事务标识++
                    Log4Util.Info(callObj, "事务标志+1(threadId:" + thread.GetHashCode() + "   value:" + _SessionList[thread] + ")" + daoManager.GetHashCode());
                }
                else
                {
                    //System.Data.IsolationLevel
                    daoManager.BeginTransaction();线程第一次访问开启事务
                    _SessionList.Add(thread, 0);//当前线程加入标识集合中
                    Log4Util.Info(callObj, "开始事务(threadId:" + thread.GetHashCode() + "   value:" + _SessionList[thread] + ")" + daoManager.GetHashCode());
                }
            }
        }


        /// <summary>
        /// 提交事务
        /// </summary>
        /// <param name="callObj">调用对象,一般为this</param>
        public static void CommitTransaction(object callObj)
        {
            ISqlMapper daoManager = ServiceConfig.GetInstance().DaoManager;
            Thread thread = Thread.CurrentThread;
            lock (_syn)
            {
                if (!_SessionList.ContainsKey(thread))
                    throw new ExceptionBaseEx("从未执行BeginTransaction操作.");
                if (_SessionList[thread] == 0)
                {


                    daoManager.CommitTransaction();
                    _SessionList.Remove(thread);
                    Log4Util.Info(callObj, "提交事件(threadId:" + thread.GetHashCode() + ")");
                }
                else
                {
                    _SessionList[thread]--;
                    Log4Util.Info(callObj, "事务标志-1(threadId:" + thread.GetHashCode() + "   value:" + _SessionList[thread] + ")" + daoManager.GetHashCode());
                }
            }
        }


        /// <summary>
        /// 回滚事务
        /// </summary>
        /// <param name="callObj">调用对象,一般为this</param>
        public static void RollBackTransaction(object callObj)
        {
            ISqlMapper daoManager = ServiceConfig.GetInstance().DaoManager;
            Thread thread = Thread.CurrentThread;
            lock (_syn)
            {
                if (!_SessionList.ContainsKey(thread))
                    throw new ExceptionBaseEx("从未执行BeginTransaction操作.");
                if (_SessionList[thread] == 0)
                {
                    daoManager.RollBackTransaction();
                    _SessionList.Remove(thread);
                    Log4Util.Info(callObj, "回滚事件(threadId:" + thread.GetHashCode() + ")");
                }
                else
                {
                    _SessionList[thread]--;
                    Log4Util.Info(callObj, "事务标志-1(threadId:" + thread.GetHashCode() + "   value:" + _SessionList[thread] + ")" + daoManager.GetHashCode());
                }
            }
        }
    }
原创粉丝点击