在过去几年中,我们注意到SQL Server(2008r2)数据库中死锁和长时间运行事务的数量有所增加。我们目前使用以下设置ALLOW_SNAPSHOT_ISOLATION OFF
和READ_COMMITTED_SNAPSHOT OFF
运行我们的数据库。使用重试/等待过程从代码管理死锁。
我们的应用程序代码(c#)使用默认构造函数(从反编译似乎是SqlConnection
)创建IsolationLevel.Unspecified
我相信它允许SQL自己做的事情,在我们的例子中将是与READ COMMITTED
相同(我认为)。
我们希望通过设置ALLOW_SNAPSHOT_ISOLATION ON
和READ_COMMITTED_SNAPSHOT ON
并使用RepeatableRead
覆盖c#构造函数来介绍快照。我相信这种设置组合将使我们的代码能够像现在一样运行。这将允许我们零碎地评估我们的代码库,以确保隔离级别和快照的更改不会对我们如何感知当前正在运行的SQL过程产生负面影响。当然,我们需要将SET TRANSACTION ISOLATION LEVEL SNAPSHOT
添加到我们想要从快照中受益的任何过程的开头(以覆盖IsolationLevel.RepeatableRead
的c#设置。)
以这种方式处理它的原因是两个数据库设置基本上迫使我们使数据库脱机,这需要一个维护窗口,我们希望准备进行逐步更改但希望代码继续执行相同的操作因为它会立即跟随变化。
我只是在寻找一些确认,我的理解是正确的。如果我错了,为了模拟我们当前的工作环境,在进行2次数据库更改后,我需要做些什么?