zoukankan      html  css  js  c++  java
  • EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"

    解决方案代码一:使用lock锁定

    //对于锁推荐使用静态私有静态变量  
    private readonly static object _MyLock = new object();  
    /// <summary>  
    /// 事务, 多表修改  
    /// </summary>  
    /// <param name="name"></param>  
    /// <returns></returns>  
    public bool UpdateName(string name)  
    {  
        lock (_MyLock)  
        {  
            using (var tran = new TransactionScope())  
            {  
                ModuleOperate _module = new ModuleOperate();  
                1.修改模块名称  
                _module.UpdateFirstName("模块:" + name);  
                2.修改菜单  
                this.UpdateFirstName("菜单:" + name);  
                提交事务  
                tran.Complete();  
            }  
        }  
        return true;  
    }  

    解决方案代码二:使用Monitor封装TransactionScope

    using (var tran = new EFTransaction())  
    {  
        //修改名称  
        name = ">>ModuleOperate:" + name;  
        UpdateFirstName(name);  
      
        //2.修改菜单  
        MenuOperate _menu = new MenuOperate();  
        _menu.UpdateFirstName(name);  
      
        //提交事务  
        tran.Commit();  
    }  

     EFTransaction类定义:

    /// <summary>  
    /// 自定义事务处理,  
    /// 此版本,数据库上下文会出现多个,所以事务使用 TransactionScope   
    /// 使用排它锁,确保事务的单线程执行  
    /// </summary>  
    public class EFTransaction : IDisposable  
    {  
        private readonly static object _MyLock = new object();  
        /// <summary>  
        /// 当前事务对象  
        /// </summary>  
        private TransactionScope tran = null;  
        public EFTransaction()  
        {  
            Monitor.Enter(_MyLock);//获取排它锁  
            this.tran = new TransactionScope();  
        }  
        /// <summary>  
        /// 提交  
        /// </summary>  
        public void Commit()  
        {  
            tran.Complete();  
        }  
        /// <summary>  
        /// 混滚操作,在Dispose(),中自动调用回滚  
        /// </summary>  
        public void Rollback()  
        {  
            //提前执行释放,回滚  
            if (tran != null)  
                tran.Dispose();  
        }  
        public void Dispose()  
        {  
            if (tran != null)  
                tran.Dispose();  
            Monitor.Exit(_MyLock);//释放排它锁  
        }  
    }  

    原文:http://blog.csdn.net/u011127019/article/details/54576873

  • 相关阅读:
    del:根据索引值删除元素
    Python insert()方法插入元素
    Python extend()方法添加元素
    Python append()方法添加元素
    Python list列表添加元素的3种方法
    什么是序列,Python序列详解(包括序列类型和常用操作)
    Python运算符优先级和结合性一览表
    Python print()函数高级用法
    Python input()函数:获取用户输入的字符串
    Python变量的定义和使用
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/8195009.html
Copyright © 2011-2022 走看看