gpt4 book ai didi

c# - 在使用 Linq-to-sql 完成插入之前,如何锁定表以防止写入操作

转载 作者:行者123 更新时间:2023-11-30 16:23:40 25 4
gpt4 key购买 nike

我正在开发一个拍卖系统,我试图确保自己不会受到影响的其中一个问题是 2 个人在同一时间对同一元素出价的情况。

为此,我需要锁定表,获取当前项目的最高出价,确保输入的出价大于该出价,向表中添加新的出价条目,然后解锁表。

我需要锁定它,这样第二个网络服务器就不会在我检查最高出价和将新出价插入表格之间触发出价插入,因为这会导致数据问题。

如何使用 Linq-to-sql 完成此操作?

请注意,我不知道 transactionscopes 是否可以做到这一点,但我不能使用它们,因为由于我们的 webfarm 设置,它们往往会触发分布式事务,而我不能使用分布式事务。

最佳答案

在纯 Linq 中实现解决方案似乎有几个障碍:

  • 你绝对应该避免表锁

表锁会导致在一次出价处理过程中无法对多个项目进行出价,从而严重损害性能

  • Linq to SQL 好像不支持悲观锁

如 SO 的其他答案所述。

如果您的代码中不能有事务,我建议执行以下过程:

  • 为您的操作生成一个 GUID
  • 使用 guid 伪锁定项目的记录:

    UPDATE Items SET LockingGuid = @guid 
    WHERE ItemId = @ItemId and LockingGuid IS NULL

    SELECT @recordsaffected = @@ROWCOUNT
  • 如果@@rowcount == 1,则锁定成功

  • 执行您的出价操作
  • 将记录更新回 LockingGuid = NULL

  • 如果锁定失败,要么将失败报告给 .Net 客户端,要么使用 WAITFOR 忙等待.

您应该实现适当的异常处理,以便项目记录不会被垂死或失败的进程无限期地锁定,可能是通过添加一个日期时间列来存储发生锁定的时间戳,并清理孤立的锁。

如果您的架构允许单独的后端操作,您可能想看看 CQRSEvent Sourcing用于处理此类投标操作。

关于c# - 在使用 Linq-to-sql 完成插入之前,如何锁定表以防止写入操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com