3

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

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

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

谢谢

4

3 回答 3

2

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

您可能还想在更新过程中查看事务隔离,如果您还没有的话

于 2012-07-16T21:26:24.360 回答
2

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

SELECT * FROM Table WITH (NOLOCK);

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

指定允许脏读。不下发共享锁以防止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻止当前事务读取锁定的数据。

请注意,这NOLOCK可能会导致数据不准确,因此在系统的其余部分中使用它可能不是一个好主意。

于 2012-07-16T21:27:18.703 回答
1

An alternative to NOLOCK (which can lead to very bad things, such as missed rows or duplicated rows) is to allow read committed snapshot isolation at the database level and then issue your query with:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
于 2012-07-16T21:31:41.320 回答