每个日期只允许一条带有 LOCK 的记录
本文关键字:LOCK 记录 一条 日期 许一条 | 更新日期: 2023-09-27 17:55:45
这是我当前的代码
[HttpPost]
public void AddMenuItem(DateTime MenuDate, string MenuItemIds_String)
{
if (string.IsNullOrEmpty(MenuItemIds_String)) { return; }
var MenuItemIds = MenuItemIds_String.Split(',').Select(x=>int.Parse(x));
int JamaatId = 1;
object thisLcok = new object();
lock (thisLcok)
{
bool ParentPresent = db.DailyMenus.SingleOrDefault(x => x.JamaatId == JamaatId && x.MenuDate == MenuDate) != null;
if (!ParentPresent)
{
db.DailyMenus.Add(new DailyMenu { JamaatId = JamaatId, MenuDate = MenuDate, MenuNoteText = string.Empty });
db.SaveChanges();
}
}
DailyMenu parentMenu = db.DailyMenus.Single(x => x.JamaatId == JamaatId && x.MenuDate == MenuDate);
foreach(int id in MenuItemIds){
bool AlreadyExits = parentMenu.DailyMenuItems.SingleOrDefault(x => x.MenuItem == db.MenuItems.Find(id)) != null;
if (!AlreadyExits)
{
db.DailyMenuItems.Add(new DailyMenuItem { MenuItem = db.MenuItems.Find(id), DailyMenu = parentMenu });
db.SaveChanges();
}
}
}
我只想创建父记录 如果不存在。由于这是一个 http 发布方法。许多人可以同时发布到它,并且可以为同一日期创建多个项目。
放锁并没有解决它。同一日期仍会创建多个项目。我把锁放对了吗?
我把锁放对了吗?
不。让我们看一下您的代码:
object thisLcok = new object();
lock (thisLcok)
{
...
}
这每次都会创建一个新锁 - 因此另一个请求不可能已经拥有该锁。
您的锁需要在所有请求之间共享。这意味着它需要是一个领域...静态字段 (ICK) 或某个对象中的实例字段已在所有请求之间共享。但是,这仍然仅适用于单个AppDomain,单个盒子 - 它不会很好地扩展,或者在面对AppDomain回收时起作用。
在我看来,您可能应该使用数据库约束来处理这个问题 - 因此请检查记录是否已存在,如果不存在,请尝试插入它 - 了解如果另一个请求到达两者之间,您将失败。