在数据库A-Tables中发生了频繁的SELECT,UPDATE,BULK INSERTS,并且发生了严重阻塞,并且每次选择BULK INSERT作为死锁受害者,并且由于BULK INSERT失败,我们正在丢失一些数据。
SELECT阻止BULK INSERT或UPDATE每次阻塞BULK INSERT,反之亦然,所有这些语句(查询)都来自应用程序。我们没有使用任何存储过程(遗憾的是我们不能使用存储过程)
数据库快照是READ Committed,简单的恢复模型,正确索引并且没有找到碎片。统计数据是最新的,MAXDOP正确设置,优化ad hoc工作负载= 1,AUTO_UPDATE_STATISTICS_ASYNC ON,mdf和ldf的自动增长为500mb,mdf和ldf ..btw的tempdb自动增长为500mb,所有数据库都坐在相同的磁盘。内存为6GB。总数据库大小(如果为60GB)。 SQL Server 2012标准版。 PageFile.Sys是9.8GB。等待统计数据为LCK_M_IX(59%),PAGEIOLATCH_SH(25%)
我想知道,如果有办法解决这个问题吗?
有没有办法强制代码来自应用程序(查询计划)在SELECT上使用NO LOCK?或任何方式强制任何查询或任何登录xyz应用程序使用NO LOCK?
更改ISOLATION LEVEL以阅读未提供的帮助吗?
将死锁优先级设置为低电平?
答案 0 :(得分:1)
BULK INSERT命令有一个表锁定选项,可以帮助您的情况。如果批量插入可以在要插入的表上获取独占锁定,则在批量插入完成之前,将阻止其他进程使用该表。这应该允许您的批量插入以避免死锁;但是,如果您的批量插入是长时间运行,则期望其他竞争进程被阻止并可能超时。
请参阅以下摘自MSDN的https://msdn.microsoft.com/en-us/library/ms188365.aspx。
<强> TABLOCK 强>
指定在批量导入操作期间获取表级锁。如果表没有索引并且指定了TABLOCK,则表可以由多个客户端同时加载。默认情况下,锁定行为由表选项批量加载表锁定确定。在批量导入操作期间持有锁会减少对表的锁争用,在某些情况下可以显着提高性能。有关性能注意事项的信息,请参阅&#34;备注,&#34;稍后在本主题中。