实体框架抛出“交易陷入僵局”

时间:2013-12-17 15:16:41

标签: asp.net entity-framework transactions deadlock

我有一个使用实体框架的Web应用程序,Ninject为每个请求注入。

我有一个临时将一些数据插入数据库,执行某些操作然后将其删除的操作。

按顺序调用此操作一切正常。

多次调用此操作,我在删除功能上完全得到Transaction (Process ID 65) was deadlocked个异常。

出现此错误的原因是什么?是删除创建内部交易吗?

如果是,是否有任何方法可以“调整”交易以允许并发呼叫?

不要问我为什么需要添加然后从数据库中删除项目 - 我只需要,ProcessMenu()函数正在从数据库中读取数据

public void UpdateEntities()
{
    ApplicationEntitiesWrapper entities = GenerateEntities();

    // ok
    InsertEntitiesInDatabase(entities);

    // process entities, ok
    ProcessMenu(entities.Menu.Id);

    // delete entities
    DeleteEntitiesFromDatabase(entities);
}

public void InsertEntitiesInDatabase(EntitiesWrapper entities)
{
    foreach (ValidationBrokenRule validationBrokenRule in entities.ValidationBrokenRules)
    {
        _db.ValidationBrokenRules.Add(validationBrokenRule);
    }

    foreach (TreePage page in entities.TreePages)
    {
        _db.TreePages.Add(page);
    }

    _db.Menus.Add(entities.Menu);

    _db.SaveChanges();
}

public void DeleteEntitiesFromDatabase(EntitiesWrapper entities)
{
    foreach (ValidationBrokenRule validationBrokenRule in entities.ValidationBrokenRules)
    {
        _db.ValidationBrokenRules.Delete(validationBrokenRule);
    }

    foreach (TreePage page in entities.TreePages)
    {
        _db.TreePages.Delete(page);
    }

    _db.Menus.Delete(entities.Menu);

    // throws "Transaction (Process ID '') was deadlocked"
    _db.SaveChanges();
}

Database tables:

ValidationBrokenRule:
Id (uniqueidentifier, PK),
Menu_Id (uniqueidentifier, FK),
Message (nvarchar)

TreePage:
Id (uniqueidentifier, PK),
ParentTreePage_Id (uniqueidentifier, FK),
Menu_Id (uniqueindentifier, FK),
Name (nvarchar)

Menu:
Id (uniqueidentifier, PK),
Name (nvarchar)

0 个答案:

没有答案