【问题标题】:How to handle promo code assignment in the Entity Framework without collisions?如何在没有冲突的情况下处理实体框架中的促销代码分配?
【发布时间】:2009-03-13 20:14:20
【问题描述】:

假设我有一张促销代码表和一张联系人表。每个联系人可以有 1 个促销代码,每个促销代码只能分配给 1 个联系人。我将如何使用一个分配程序,从表中选择一个促销代码,并将其分配给一个联系人,而不会出现并发问题/冲突。

最坏的情况:

  1. 联系人 A 请求代码。
  2. 找到第一个可用的促销代码,并从 DB 中选择促销代码 A。
  3. 联系人 B 请求代码。从数据库中找到并选择第一个可用的促销代码,促销代码 A。
  4. 对联系人 A 的更改已保存。
  5. 对联系人 B 的更改已保存。

现在,根据促销代码分配的存储方式,将会发生 2 件事中的 1 件事:

  1. 2 位联系人将分配相同的促销代码。
  2. 如果引发重复键异常,联系人 B 将收到错误消息。

仅供参考,我正在使用 HTTPContext 中保存的 DataContext,以便每个 HTTP 请求都可以使用它。不确定这是否重要。

那么,使用 C# 和实体框架,我如何才能在不遇到这些类型的冲突的情况下完成此促销代码分配?提前致谢!

【问题讨论】:

    标签: c# database entity-framework database-design locking


    【解决方案1】:

    我会在促销代码表中添加一列,以便能够将代码标记为已使用。

    读取促销代码将在可重复读取事务中完成,该事务还将促销代码标记为已使用。

    这保证了促销代码只能使用一次。

    【讨论】:

      【解决方案2】:

      我不能这样做吗:

      UPDATE PromoCodes
      SET Assigned = 1
      ContactID = x
      LIMIT 1
      

      这样,我就不用事先看代码了,直接赋值过来,之后就可以拿到了:

      SELECT * FROM PromoCodes
      Where ContactID = x
      

      有关于这个方法的cmet吗?

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        相关资源
        最近更新 更多