【问题标题】:SQL Server: Concurrent read of non repeatable rows [duplicate]SQL Server:不可重复行的并发读取[重复]
【发布时间】:2014-01-03 17:44:07
【问题描述】:

怎么可能做出这样的场景:

我有带有 Order 对象的表。 DB中有很多订单。有很少线程的机制可以从 DB 获取下一个订单(但需要锁,相同的订单不会被执行几次)。

如何在 SQL Server 级别使一个线程读取行(顺序),将其从 DB 中删除并将其返回给执行它的 C# 编写机制,当其他线程可以看到该行被锁定时,它会跳过该行并占用下一行?

订单有执行优先级,聚集索引在优先级列上。

这些东西会在存储过程中执行。

【问题讨论】:

  • Locking hintsTransaction Levels。这里还有很多关于行锁定的问题。
  • (注意骗子使用UPDATE,你需要DELETE,但基本相同)
  • 请注意,您必须非常小心数据库和应用程序之间的操作顺序,否则您可能会丢失项目(从数据库中删除后应用程序崩溃)。

标签: sql sql-server multithreading


【解决方案1】:

我会在名为“locked_by_thread”的表中添加一个列,其中包含一个线程号,当没有线程锁定它时,它会为空。在这种情况下,您必须更频繁地提交,但这是我要做的。

【讨论】:

  • 我不允许更改表结构。有人告诉我使用 SQL Server 锁/隔离级别或类似的东西,但是谢谢,好主意
  • 为什么不简单地将这个新列称为 OrderState 并带有一些可能的值:New、Processing、Processed。
  • 这是个好主意,但是每次我尝试这样的事情时,我还需要知道,什么时候阻止了它,谁阻止了它——以防进程死亡或发生什么,我们需要将它们归零。我想你可以有一个时间戳来说明该列的设置时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2015-07-01
  • 2014-07-04
  • 1970-01-01
相关资源
最近更新 更多