我在SQL Server 2012中有一个表,该表正在由服务不断使用,该服务正在不断更新表中的记录。服务有点像一个队列,服务在其中处理记录,然后定期运行另一个存储过程,以将处理后的记录拉出到另一个表中。该表中的记录以一种状态开始,在处理过程中,它们进入另一种状态。
当我尝试运行存储过程以拉出已完成的记录时,如果正在运行的进程更新表时碰巧发生了这种情况,则我遇到了一个死锁问题,该问题大约每2分钟发生一次。我本来只是想使用NOLOCK
提示来消除这种情况,但是在阅读了一下SO thread之后,我想我应该尽可能避免使用NOLOCK
。
目标:
允许该服务继续照常运行,但是还允许另一个存储过程定期进入并删除已完成的记录。如果给定的行有锁,那么我想只保留该行,并在下次运行存储过程时选择它。在处理期间,不要求我获取存储过程的所有行。这仅在处理完所有记录之后才有意义,这时我需要确保获得所有记录,同时使服务仍在其他不相关的记录上运行,并且不会引起任何死锁问题。希望这是有道理的。
This article似乎建议REPEATABLE READ
我在正确的道路上还是有更好的方法?