事务(进程ID 98)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。重新运行该交易

时间:2015-05-18 13:36:27

标签: c# multithreading entity-framework

据我所知,抛出此异常是因为我的多个线程试图访问数据库上的相同数据。但是异常会抛出一行,我将一个枚举转换为一个列表。

任何人都能解释一下吗?

(Program.GetContext(),用于获取数据库的当前线程上下文,因为它是多线程的,并且使用EF这是一种方法)

var loadedSammenSat = Program.GetContext().SammensatKodetVaerdier.Where(o => (o.Kode == kode) && (o.Kodetekst == kodetekst) && (o.Forkortelse == forkortelse) && (o.Navn == navn)).Include(b => b.Tillaegskode).ToList();


    if (!sammensatKodet.Tillaegskode.Any())
    {
        var selceted = loadedSammenSat.FirstOrDefault(o => (o.Tillaegskode == null || o.Tillaegskode.Count == 0));
        if (selceted != null)
            return selceted;
    }
    else
    {
        var selcetedWithOutList = loadedSammenSat.Where(o => (o.Tillaegskode != null && o.Tillaegskode.Count() == sammensatKodet.Tillaegskode.Count()));
        var selceted = selcetedWithOutList.ToList(); //LINE THAT THROW EXCEPTION!!
        if (selceted.Count() > 0)
        {
            List<DBTillaegsKode> list = new List<DBTillaegsKode>();
            sammensatKodet.Tillaegskode.ForEach(p => list.Add(new DBTillaegsKode(p.KodetVaerdi)));

            foreach (var dbSammensatKodetVaerdi in selceted)
            {
                var mismatch = dbSammensatKodetVaerdi.Tillaegskode.Except(list);
                if(mismatch.GetEnumerator().Current != null)
                    if (mismatch.Count() == 0)
                    {
                        return dbSammensatKodetVaerdi;
                    }  
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

LINQ是延迟加载的 - 只有当您对结果集执行某些操作(在这种情况下执行.ToList()操作)时才会执行查询。