gpt4 book ai didi

SQL Server Read Uncommitted 阻塞事务

转载 作者:行者123 更新时间:2023-12-01 06:33:22 27 4
gpt4 key购买 nike

我在 SQL 中有一个工作队列,由一些服务管理,这些服务读出要处理的条目 READPAST查询。

我最近添加了一个 UI 来检查使用 READ UNCOMMITTED 的队列状态C# 中的 NHibernate 查询。他们给我正确的数字并不重要,只是表明处理过程有多远。

/* called from a foreach (I know... I could get them all at once with SQL) */
IQuery query = Persistence.CreateQuery(
"select count(qi) from QueueItem qi where qi.Job = :job");
query.SetEntity("job", thisJob);
using(Persistence.ReadUncommitted())
{
return (long)query.UniqueResult();
}

问题是这些状态查询已经开始导致超时。有时他们自己失败了;有时它们会导致队列操作失败。

main MSDN documentation说如果我更改架构,仍然可以锁定,但我不是。

另一方面, Marcel van der Holst显然为 Microsoft 的 SQL Server 团队工作, says this关于这个问题(迈克尔提出问题的不是我):

READ UNCOMMITTED transactions will not take any database locks, but will still have to read databases pages to read the actual data. If other transactions are writing these pages at the same time, their might be some blocking between the two. Internally in the engine, we do not allow any transactions to read a page while a write is being in progress (we use latches to guarantee this). If a lot of transactions are writing while your big queries are going on, the big read might still become blocked.



我做错了什么吗?我应该改变什么来停止阻塞?

架构
create table QueueItem(
ID int identity(1,1) not null,
JobID int not null,
PersonID int not null,
DateProcessed datetime null,
Error varchar(max) null,
constraint [PK_QueueItem] primary key nonclustered (ID)
)

alter table QueueItem
add constraint [FK_QueueItemsToJobs] foreign key (JobID)
references Job (ID)

非聚集索引:
JobID, DateProcessed, PersonID, ID (Non-Unique, Non-Clustered)
DateProcessed, JobID, PersonID (Non-Unique, Non-Clustered)
JobID, ID (Unique, Non-Clustered)
JobID, PersonID, ID (Unique, Non-Clustered)
PersonID, JobID, ID, DateProcessed (Unique, Non-Clustered)
ID (Unique, Non-Clustered)

在实践中

我减少了读取次数,因为它不会使速度变慢,但我仍然很好奇为什么可能会阻塞 READ UNCOMMITTED .

最佳答案

我不是 NHibernate 的专家,但是您应该尝试将 NOLOCK 添加到您的状态查询中;在 NHibernate 中使用 SetLockMode。

  • 减少索引的数量,看起来每一列都被索引了。
  • 您没有使用聚集索引,请在 JobID、ID 列上添加唯一的聚集索引。
  • 关于SQL Server Read Uncommitted 阻塞事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000690/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com