【问题标题】:Best way to lock table entity framework core锁定表实体框架核心的最佳方法
【发布时间】:2020-02-10 15:56:06
【问题描述】:

我目前正在做一个在线售票网站的项目。我有一张票表,其中包含所有已购买的票,链接到票的类型和事件。

我面临的问题是,如果一项赛事分配了 500 张门票,并且我有多个人试图购买门票,我该如何阻止比赛条件超出容量。

这是一个示例场景:

售出 498 张门票

用户 1 和用户 2 尝试同时购买两张票: 用户 1 - 现场检查可用门票 498 已售出,2 可用 用户 2 - 现场检查可用门票 498 已售出,2 可用 用户 1 - 为购买的门票添加 2 行,售出 500 张 用户 2 - 为已购买的门票添加 2 行,已售出 502 个

我知道我可以重新检查已售票的数量,如果超过 500 个,则将这些行移出....但这听起来不是一个优雅的解决方案。

我正在使用实体框架核心和 .net 核心剃须刀页面来开发网站。

提前致谢,

马特

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    标准解决方案是使用transactions,它会在后台锁定表,直到操作成功完成,或回滚任何因错误所做的更改。

    来自链接页面:

    using (var context = new BloggingContext())
    {
        using (var transaction = context.Database.BeginTransaction())
        {
            try
            {
                context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
                context.SaveChanges();
    
                context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
                context.SaveChanges();
    
                var blogs = context.Blogs
                    .OrderBy(b => b.Url)
                    .ToList();
    
                // Commit transaction if all commands succeed, transaction will auto-rollback
                // when disposed if either commands fails
                transaction.Commit();
            }
            catch (Exception)
            {
                // TODO: Handle failure
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 2017-03-28
      • 2019-05-12
      • 2021-12-18
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2017-06-30
      相关资源
      最近更新 更多