0

我在 Azure SQL 中有一个包含多条记录的表。此表中的数据通过实现多种读/写方法的 API 层(基于实体框架)公开。此 API 层封装在支持多个实例的工作角色中。我有一个可以在不同客户端机器上同时运行的应用程序(桌面应用程序,而不是 Web 角色)。此应用程序使用上述 API 进行 2 次特定调用 - 一次读取和另一次写入。两个调用都将访问 Azure SQL 表中的相同记录。我正在寻求实现一种锁定机制,以防止多个客户端尝试使用我的应用程序读取相同的记录。然而,这个记录级别的读锁应该只在进行特定的读取调用时应用(在 API 公开的许多读取调用中)。虽然我已经想出了如何锁定记录,我不确定如何实现特定于一个特定调用的这个锁。当我们考虑到实现 API 的工作角色有多个实例在运行时,这会更加复杂。

到目前为止我考虑过的一些想法:

  1. 存储过程:实体框架 - 读取锁定记录。这遇到了仅为特定读取调用锁定行的问题。
  2. 我的应用程序使用的 API 中的读取调用中的关键部分锁定。然而,当多个 worker 实例正在运行时,这将无济于事,因为临界区锁只会在实例级别。
  3. 使用额外的 IsProcessing 列,在第一次读取时将其标记为 true。这可以与idea-1 和/或idea-2 结合使用。
  4. 重构我在 API 中使用的读取调用以实现行级锁定。由于我的应用程序是唯一使用此特定读取调用的应用程序,这可能是一个可能的解决方案,但是我将如何仅为此调用启用锁定,因为来自其他 API 调用的其他读取仍然应该成功......还有后勤由于这个想法是绝对的最后手段,如果可能的话我真的不想实施。

任何指针表示赞赏。

更新:

在我的应用程序使用的特定读取调用中使用互斥锁似乎是一种可能的解决方案。

4

1 回答 1

1

我不会质疑你为什么要这样做,但由于复杂程度,我远离这种类型的设计,而通常实现乐观并发。

要直接回答您的问题,我可能会实施 Windows Azure 缓存,如果这对您的设计有意义,可能会带有过期窗口。您可以将主键 (PK) 值放入缓存中,并在返回记录之前验证该值是否在缓存中或不在 API 中。如果是,则不返回记录;不是的,您允许读取并将 PK 放入缓存中。

于 2013-05-02T14:29:28.430 回答