【问题标题】:Locking Azure SQL record only when accessed by a specific call仅在特定调用访问时锁定 Azure SQL 记录
【发布时间】:2013-05-01 22:56:37
【问题描述】:

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

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

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

任何指针表示赞赏。

更新:

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

【问题讨论】:

    标签: c# .net azure locking azure-sql-database


    【解决方案1】:

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

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

    【讨论】:

    • 我最终做了与您的建议类似的事情,涉及我的 API 代码中的互斥锁以及从表中读取的对象/记录的附加 IsProcessing 属性/列。
    猜你喜欢
    • 2012-10-25
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多