gpt4 book ai didi

sql-server - 无法在快照隔离模式下使用 READPAST

转载 作者:行者123 更新时间:2023-12-02 04:16:20 25 4
gpt4 key购买 nike

我有一个从多个线程调用的进程,它执行以下操作:

  • 开始交易
  • 通过查找 IsProcessed=0 的下一行从工作表中选择工作单元有提示(UPDLOCK, HOLDLOCK, READPAST)
  • 处理工作单元(C# 和 SQL 存储过程)
  • 提交事务

  • 这样做的想法是一个线程浸入池中以获取“下一个”工作,并对其进行处理,并且锁在那里确保单个工作不会被处理两次。 (顺序无关紧要)。

    几个月来,所有这些都运行良好。直到今天,当我碰巧意识到尽管启用了快照隔离并将其设置为数据库级别的默认设置,但实际的事务创建代码是手动设置了“ReadCommitted”的隔离级别。

    我适时将其更改为“快照”,当然立即收到以下消息:

    You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ



    锁定行的主要原因是“标记行”,以便在提交应用标记的事务时删除“标记”,并且锁定似乎是执行此操作的最佳方式,因为这除了这些线程之外,不会以其他方式读取 table。如果我要使用 IsProcessed 标志作为锁,那么大概我需要先进行更新,然后选择我刚刚更新的行,但我需要使用 NOLOCK 标志来知道是否有任何其他线程设置了标志在一行。

    一切听起来有点乱。最简单的选择是完全放弃快照隔离模式,但第 3 步的设计需要它。

    关于解决这个问题的最佳方法有什么好主意吗?

    最佳答案

    将特定事务的隔离级别更改为默认读取提交以外的其他内容(在您的情况下,您默认以快照模式运行)。然后您可以将数据库中的其他工作保留在快照中,但您的代码中的这个特定工作流将不是快照。

    关于sql-server - 无法在快照隔离模式下使用 READPAST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639112/

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