Sql 大型记录集上的锁定问题

Sql 大型记录集上的锁定问题,sql,sql-server-2008,sql-server-2005,Sql,Sql Server 2008,Sql Server 2005,我有一个数据库表,用作队列系统,在其中相互通信的单独进程创建和读取表中的条目。例如,当用户启动搜索时,将创建一个条目,然后每隔一两秒钟运行的另一个进程将拾取该新条目,更新状态,然后执行搜索,搜索完成后再次更新条目。在每小时数千次搜索的情况下,这一切似乎都很有效 不过,我有一个主管理屏幕,可以查看所有这些“作业”的状态,但运行速度非常慢。我基本上会返回表中最后一个小时的所有条目,这样我就可以关注发生了什么。我想我遇到了某种锁问题。我只需要阅读每个条目,并不在乎数据是否有点过时。我只是使用了一个标准

我有一个数据库表,用作队列系统,在其中相互通信的单独进程创建和读取表中的条目。例如,当用户启动搜索时,将创建一个条目,然后每隔一两秒钟运行的另一个进程将拾取该新条目,更新状态,然后执行搜索,搜索完成后再次更新条目。在每小时数千次搜索的情况下,这一切似乎都很有效

不过,我有一个主管理屏幕,可以查看所有这些“作业”的状态,但运行速度非常慢。我基本上会返回表中最后一个小时的所有条目,这样我就可以关注发生了什么。我想我遇到了某种锁问题。我只需要阅读每个条目,并不在乎数据是否有点过时。我只是使用了一个标准的“Select*fromtable”语句,所以它可能在返回数据之前等待其他锁过期,因为作业正在不断更新数据

如果使用某种游标一次返回一行,会更好地处理这个问题吗?还有其他想法吗


谢谢

您需要使用(NOLOCK)表格提示从您的表格中获取


如果您还没有

,如果您真的不在乎数据是否有点过时,您可能还希望在更新过程中查看事务隔离。。。或者,如果您只需要99.99%的数据,请考虑使用:

这将指示您的查询使用
读取未提交隔离级别
,该级别具有以下行为:

指定允许脏读。没有向用户颁发共享锁 阻止其他事务修改当前事务读取的数据 事务,而由其他事务设置的独占锁不会 阻止当前事务读取锁定的数据


请注意,因此在系统的其余部分使用它可能不是一个好主意。

替代
NOLOCK
(这可能会导致非常糟糕的事情,例如丢失行或重复行)的方法是,然后使用以下命令发出查询:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

谢谢,效果很好。99.9%的准确率是可以接受的,这只是为了让我大致了解每件事情的运行情况。对于我目前的需要来说,这可能有点复杂,但我会在以后记住这一点。谢谢你的建议。
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;