我有一个数据库表,我将其用作队列系统,其中相互通信的单独进程在表中创建和读取条目。例如,当用户启动搜索时,创建一个条目,然后每隔一秒或两秒运行的另一个进程将获取该新条目,更新状态然后进行搜索,在搜索完成时再次更新条目。这一切似乎每小时有数千次搜索。
但是,我有一个主管理屏幕,可让我查看所有这些“工作”的状态,但运行速度非常慢。我基本上会在最后一小时内返回表格中的所有条目,因此我可以关注正在发生的事情。我认为我遇到了某种锁定问题。我只需要阅读每个条目,并不关心数据是否有点过时。我只是使用标准的“Select * from Table”语句,因此可能在返回数据之前等待其他锁定到期,因为作业会不断更新数据。
通过某种游标可以更好地处理这一点,一次返回一行,等等吗?还有其他想法吗?
由于
答案 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;