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

ASP.NET 专栏收录该内容
16 篇文章 0 订阅
    /// <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());
                }
            }
        }
    }
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

伊万洛夫拉裤兜

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值