我有一个代表传入记录的表,它有一个ISPROCESSED列。我有多个线程,通过独占行锁(XLOCK,ROWLOCK)选择ISPROCESSED = 0的所有行,然后执行相对长时间运行的事务。最后,他们将ISPROCESSED行更新为1.
如果池中的一个线程正在运行此事务,则阻止其他线程处理在第一个线程事务期间可能进入表的任何新记录,并且必须等待它完成。
理论上,另一个线程应该能够处理任何新的未处理记录(并在其上放置自己的行锁)。有没有办法允许其他线程的select运行不阻塞,只需选择没有当前独占锁的行?换句话说,看到表格好像当前锁定的行甚至不存在。
答案 0 :(得分:1)
是 - 使用SELECT (list-of-columns) FROM dbo.YourTable WITH READPAST
。
这只是跳过当前被锁定的行,因此读取连接无法访问 - 就好像那些行不存在一样。
答案 1 :(得分:0)
有没有办法允许其他线程的select运行不阻塞,
有一种方法可以告诉select跳过锁定的记录。我来检查...谷歌搜索“sql server skip locked rows”有一些很好的参考。
查找READPAST表提示;)
跳过锁定的行。此选项会导致事务跳过已锁定的行 通过通常出现在结果集中的其他事务, 而不是阻止等待其他事务的事务 释放他们对这些行的锁定。
在我看来,文档有一个很好的解释,这个提示就是你要找的。 p>