【发布时间】:2011-10-07 07:54:56
【问题描述】:
因为我已经识别出同时查询的表上的锁,所以我决定启用ISOLATION LEVEL SNAPSHOT,这对我来说是新的。
ALTER DATABASE RM2 SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
ALTER DATABASE RM2 SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE RM2 SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE RM2 SET MULTI_USER;
但现在我想知道是否可以自动将这种隔离级别应用于所有现有查询,因为该数据库包含许多视图、存储过程、表值函数,并且被许多不同的应用程序查询(例如 SSRS、SSAS、 ASP.NET 与 ADO.NET,Excel 中的 ADO 连接)。
如果我理解正确,我必须修改查询以使用 IsolationLevel.Snapshot,例如:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
BEGIN TRAN SparePartReport
SELECT TOP 100 PERCENT * FROM DBO.Last3MonthSparepartReport
COMMIT TRAN SparePartReport
问:是否有可能以某种方式最大限度地减少工作量,因为我无法更改所有应用程序和查询。另一个问题似乎是我不能直接在视图上应用 IsoalationLevel。
注意:数据库中的大多数相关表全天都是只读的,因为数据是通过 Windows 服务和存储过程在一夜之间导入的。
提前致谢
虽然@Maximilian 的回答似乎是正确的,但在同时运行大型报告时,我仍然在 ASP.NET 应用程序中遇到死锁/超时情况。 Here is the followup question.
【问题讨论】:
-
为什么要使用隔离级别快照?您可以将 READ_COMMITTED_SNAPSHOT 设置为 ON,这样,READ COMMITTED(这是标准隔离级别)将使用行版本控制而不是锁......这不适合您吗?阅读以下微软文章:msdn.microsoft.com/en-us/library/ms188277.aspx
-
@Maximilian:谢谢(你应该把这个作为答案)。这意味着我根本不需要做任何事情,因为我已经将 READ_COMMITTED_SNAPSHOT 设置为 ON,只要我不使用该隔离级别,我就可以保持 ALLOW_SNAPSHOT_ISOLATION ON 而不会产生任何影响?
-
是的,您可以将 ALLOW_SNAPSHOT_ISOLATION 保持为 ON。
-
@Maximilian:当 READ_COMMITTED_SNAPSHOT ON 时,
WITH NOLOCK表提示现在在查询中是多余的吗? -
不,不是。 WITH NOLOCK 指定允许脏读。与设置 ISOLATION LEVEL READ UNCOMMITTED 相同。
标签: sql-server sql-server-2005 ado.net transactions