我应该在哪里解决死锁?

JHF*_*HFB 4 sql-server-2008

我们在服务器 A 上有一个应用程序数据库,它使用推送事务复制复制到服务器 B。报告是在服务器 B 上的复制副本上完成的。

我们在复制过程中遇到问题,它获得了一个共享的意向排他(SIX) 锁,死锁的SELECT语句,获得了一个意向共享(IS) 锁。该SELECT语句被选为死锁牺牲品,查询终止,报表开发人员不高兴。

我应该在哪里解决这个问题?我们应该NOLOCKSELECT语句中添加提示吗?更改一些复制设置?这里是否存在更大的问题,例如糟糕的数据库设计?

Jon*_*gel 6

虽然我从未对此进行过测试,但我会尝试在报告数据库上打开快照隔离。如果所有现有查询都使用READ COMMITTED(默认)运行,打开READ_COMMITTED_SNAPSHOT可以通过轻弹开关解决问题。

使用其中一种快照隔离级别应该可以完全消除死锁,因为单个写入器不会阻止读取器。作为一个很好的副产品,它还应该减少由于并发应用的复制更改而导致报告中出现不一致数据的可能性。