码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-01-04 22:55:55      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:efi   tran   数据库   color   自动   ble   定义   静态变量   summary   

解决方案代码一:使用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

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

标签:efi   tran   数据库   color   自动   ble   定义   静态变量   summary   

原文地址:https://www.cnblogs.com/shy1766IT/p/8195009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!