管理コントローラー クラスがあり、管理タスクでは同じアクション メソッド呼び出しでエンティティを追加および削除する必要があるため、複数の管理者が同じアクション メソッドに同時にアクセスすると、いくつかの追加操作がから開始されるのではないかと心配しています。他の追加操作は 2 番目のトランザクションから開始されます。これにより、最終結果が矛盾する結果になる可能性があります。一部の追加および削除操作は TransactionOne から開始され、他の操作は transactionTwo から開始されるためです。たとえば、私はアクションメソッドを持っています:-
[Authorize]
public class SecurityRoleController : Controller
{
Repository repository = new Repository();
//code goes here
[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);
}
したがって、予期しない結果を避けるために、次のようにアクション メソッド内にロックを含めることにしました。
[Authorize]
public class SecurityRoleController : Controller
{
Repository repository = new Repository();
public static object REQUEST_LOCK = new object();
//code goes here
[HttpPost]
public ActionResult AssignPermisionLevel2(ICollection<SecurityroleTypePermision> list, int id)
{
lock (REQUEST_LOCK)
{
repository.DeleteSecurityroleTypePermisions(id);
foreach (var c in list)
{
repository.InsertOrUpdateSecurityroleTypePermisions(c, User.Identity.Name);
}
repository.Save();
return RedirectToAction("AssignPermisionLevel", new { id = id });
}
}
だから、私がやっていることは正しい方法であり、私のアクションメソッド内に Lock があると、パフォーマンスに影響を与えたり、私が気付いていない欠点がありますか? よろしく