繁体   English   中英

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

[英]Cannot use READPAST in snapshot isolation mode

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

  1. 开始交易
  2. 通过查找下一行IsProcessed=0并使用提示(UPDLOCK, HOLDLOCK, READPAST)从工作表中选择工作单元
  3. 处理工作单元(C#和SQL存储过程)
  4. 提交交易

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

这几个月一直都很好。 直到今天,当我碰巧意识到尽管启用快照隔离并使其成为数据库级别的默认值时,实际的事务创建代码却手动设置了“ReadCommitted”的隔离级别。

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

您只能在READ COMMITTED或REPEATABLE READ中指定READPAST锁

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM