【问题标题】:allow only one record per date with LOCK每个日期只允许使用 LOCK 一条记录
【发布时间】:2013-01-24 06:46:33
【问题描述】:

这是我当前的代码

[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 post方法。许多人可以同时发布到它,并且可以在同一日期创建多个项目。

把锁没有解决它。仍在为同一日期创建多个项目。我把锁放对了吗?

【问题讨论】:

    标签: c# asp.net .net multithreading locking


    【解决方案1】:

    我把锁放对了吗?

    没有。让我们看看你的代码:

    object thisLcok = new object();
    lock (thisLcok)
    {
        ...
    }
    

    这每次都会创建一个新的锁 - 所以另一个请求不可能已经拥有锁。

    您的锁需要在所有请求之间共享。这意味着它必须是一个字段......要么是静态字段(ick),要么是某个对象中的实例字段,这些字段已经在您的所有请求之间共享。然而,这个仍然只能在单个 AppDomain 中、在一个盒子上工作 - 它不能很好地扩展,或者在 AppDomain 回收的情况下工作。

    在我看来,您可能应该使用数据库约束来处理这个问题 - 所以检查记录是否已经存在,如果不存在,尝试插入它 - 理解你如果中间有另一个请求,将会失败。

    【讨论】:

    • 实体框架不支持唯一约束。所以它不会失败:/似乎锁定应用程序级变量应该可以解决问题......
    • @bilalfazlani:EF 可能不会,但我确信数据库会。如果您有多个服务器或正在回收 AppDomain,则对应用程序级变量加锁将不会解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2014-10-11
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多