事务(进程ID 98)在锁资源上与另一个进程发生死锁,并被选为死锁受害者.重新运行事务



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

有人能解释一下吗?

(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;
                    }  
            }
        }
    }

LINQ是惰性加载的-只有当您对结果集执行某些操作时(在本例中执行.ToList()操作),查询才会执行。

最新更新