Sql server SQL Server删除锁定问题

Sql server SQL Server删除锁定问题,sql-server,locking,delete-row,isolation,Sql Server,Locking,Delete Row,Isolation,我有一个SQL Server数据库,通过SQL作业中计划的SQL脚本,在一定条件下从三个表a、B、C中批量删除行。由于表中包含大量数据,作业将运行2小时。作业运行时,无法访问我的前端应用程序(给出超时错误),因为应用程序在这些表中插入和更新数据A、B、C 在SQL脚本运行时,前端应用程序是否可以并行运行而不出现任何问题?我已经检查了表上的锁,SQL Server正在获取页面锁。此处的帮助可以读取提交的快照或快照隔离级别或将页锁转换为行锁。需要建议。我怀疑SQL Server在某个时候升级为表锁,

我有一个SQL Server数据库,通过SQL作业中计划的SQL脚本,在一定条件下从三个表
a、B、C
中批量删除行。由于表中包含大量数据,作业将运行2小时。作业运行时,无法访问我的前端应用程序(给出超时错误),因为应用程序在这些表中插入和更新数据
A、B、C


在SQL脚本运行时,前端应用程序是否可以并行运行而不出现任何问题?我已经检查了表上的锁,SQL Server正在获取页面锁。此处的帮助可以
读取提交的快照
快照
隔离级别或将页锁转换为行锁。需要建议。

我怀疑SQL Server在某个时候升级为表锁,这意味着该表在读取和更新时都不可访问

要在处理大型删除时优化锁定和并发性,请使用批处理。每次从5000行开始(以防止锁升级),并监视其行为以及是否需要进一步调整。5000是一个“神奇数字”,但它的数量不够,锁管理器不考虑升级到表锁,并且足够大的性能。 超时是否会发生也取决于其他因素,但如果不一起省略,这肯定会减少。如果读取操作发生超时,您应该能够消除它们。当然,另一种方法是增加客户端上的命令超时值

快照(乐观)隔离也是一个选项,
更准确地读取提交的快照
,但它对其他会话的更新没有帮助。此外,还要注意版本存储(在tempdb中)的增长。最好将其与建议的批处理方法结合起来,以保持事务量小

此外,如果数据库正常处于完全恢复状态,则在删除期间切换到大容量日志恢复。但一完成就切换回来,并进行备份


差点忘了——如果是SQL Server的企业版,请对表进行分区;然后,您可以将分区切换出去,这几乎是暂时的,客户端永远不会注意到它。

将操作分为两个阶段。在第一阶段,收集要删除的行的主键:

create table #TempList (ID int);

insert  #TempList
select  ID
from    YourTable
在第二阶段,使用循环以小批量删除这些行:

while 1=1
    begin
    delete  top (1000)
    from    YourTable
    where   ID in (select ID from #TempList)

    if @@rowcount = 0
        break
    end

较小的批处理将允许前端应用程序在它们之间继续运行。

您使用的是框架还是使用的数据库API来运行批处理?您的批处理可能太大,这可能会开始将锁升级到
TABLOCKS
并阻止并发读取提交的读卡器。建议您调整批量删除以确保每次锁数<5000个谢谢。将批处理大小减少到5000是否可以确保我的前端应用程序永远不会超时。谢谢。我将把批量减少到5000并检查。它将使sql server获取行级锁。另一个问题,这个解决方案是否证实了我的前端应用程序从来没有超时过。关于快照隔离级别,请提供更多详细信息。我在回答中添加了更多内容。谢谢。我也遵循同样的方法。但是我的批量很大。我将设置为5000并检查。此解决方案是否确认SQL server始终获得行锁,并且在我的前端应用程序中从未发生超时。这个问题还有其他解决办法吗。