锁定大型记录集上的问题

时间:2012-07-16 21:22:06

标签: sql sql-server-2008 sql-server-2005

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

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

通过某种游标可以更好地处理这一点,一次返回一行,等等吗?还有其他想法吗?

由于

3 个答案:

答案 0 :(得分:2)

您需要FROM yourtable WITH (NOLOCK)表提示。

您可能还希望在更新过程中查看事务隔离(如果您尚未

答案 1 :(得分:2)

如果您真的不在乎数据是否有点过时......或者您只需要数据准确度为99.99%,请考虑使用WITH (NOLOCK)

SELECT * FROM Table WITH (NOLOCK);

这将指示您的查询使用READ UNCOMMITTED ISOLATION LEVEL,它具有以下行为:

  

指定允许脏读。没有发布共享锁   防止其他事务修改当前读取的数据   事务和其他事务设置的独占锁不会   阻止当前事务读取锁定数据。

请注意NOLOCK may cause some inaccuracies in your data,因此在整个系统中使用它可能不是一个好主意。

答案 2 :(得分:1)

NOLOCK的替代方法(可能导致非常糟糕的事情,例如错过的行或重复的行)是allow read committed snapshot isolation at the database level,然后发出您的查询:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;