我有一个使用实体框架的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)