我在我的 asp.net mvc Web 应用程序中使用实体框架,但我无法理解它将如何处理访问相同数据的多个事务。例如,我有以下操作方法可以删除一个集合,然后遍历一个集合并删除记录:-
[HttpPost]
public ActionResult AssignPermisionLevel2(ICollection<SecurityroleTypePermision> list, int id)
{
repository.DeleteSecurityroleTypePermisions(id);
foreach (var c in list)
{
repository.InsertOrUpdateSecurityroleTypePermisions(c,User.Identity.Name);
}
repository.Save();
return RedirectToAction("AssignPermisionLevel", new { id = id });
}
这将调用以下存储库方法:-
public void DeleteSecurityroleTypePermisions(int securityroleID)
{
var r = tms.SecurityroleTypePermisions.Where(a => a.SecurityRoleID == securityroleID);
foreach (var c in r) {
tms.SecurityroleTypePermisions.Remove(c);
}
}
&
public void InsertOrUpdateSecurityroleTypePermisions(SecurityroleTypePermision role, string username)
{
var auditinfo = IntiateAdminAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "ASSIGN PERMISION").ID, tms.SecurityTaskTypes.SingleOrDefault(a => a.Name.ToUpper() == "SECURITY ROLE").ID, username, tms.SecurityRoles.SingleOrDefault(a=>a.SecurityRoleID == role.SecurityRoleID).Name, tms.PermisionLevels.SingleOrDefault(a=>a.ID== role.PermisionLevelID).Name + " --> " + tms.TechnologyTypes.SingleOrDefault(a=>a.AssetTypeID == role.AssetTypeID).Name);
tms.SecurityroleTypePermisions.Add(role);
InsertOrUpdateAdminAudit(auditinfo);
}
那么假设两个用户同时访问相同的操作方法,那么他们的事务会相互冲突吗?,或者所有事务操作(删除和添加)都将执行,然后另一个事务将开始?
更新 在我的 Controller 类中,我将按如下方式启动存储库:-
[Authorize]
public class SecurityRoleController : Controller
{
Repository repository = new Repository();
我的第二个问题是。您提到EF会将实体标记为删除或插入,然后sql将独立执行数据库。但是如果一个 sql 语句删除了一些实体,而第二个事务中的另一个 sql 语句删除了其他实体,这种冲突会发生在数据库级别吗?或者一旦第一个事务的第一个sql语句开始执行,它会阻止其他事务被执行?你能建议吗?