【问题标题】:Is it possible to set TRANSACTION ISOLATION LEVEL SNAPSHOT automatically?是否可以自动设置事务隔离级别快照?
【发布时间】: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


【解决方案1】:

您不必使用 ISOLATION LEVEL SNAPSHOT 来使用行版本控制而不是锁。你可以使用

ALTER DATABASE RM2 SET READ_COMMITTED_SNAPSHOT ON;

告诉您的数据库它应该使用带有 ISOLATION LEVEL READ COMMITTED 的行版本控制。由于这是默认隔离级别,因此您当前所有未指定不同隔离级别的查询都将自动使用行版本控制。

供参考:MSDN

【讨论】:

  • 虽然这似乎是正确的方法,但如果有人执行耗时的查询、存储过程或同时在 SQL-Server 中报告。您知道如何检查此事务级别是否按预期工作吗?
【解决方案2】:

如果数据库的 READ_COMMITTED_SNAPSHOT ON 且事务隔离级别为 READ_COMMITTED(默认值),则从数据库读取会自动使用快照隔离。

但是,除非事务隔离级别为 SNAPSHOT,否则更新仍会在语句的读取部分使用锁。您不能告诉数据库更改默认事务隔离级别,因为它的范围是连接,而不是数据库。您需要在每个连接的基础上SET TRANSACTION ISOLATION LEVEL SNAPSHOT 或使用customizing transaction isolation level 的其他方式之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多