隔离级别和DIRT READ SQL SERVER 2005(高级问题)

时间:2010-04-19 15:05:27

标签: sql sql-server sql-server-2005 locking isolation

我将以更简单的解释来描述我的问题:

我有一张桌子,而我的软件正在使用交易来访问它(更新,插入)。

问题是我想在此表中启用DIRT READ。但我不能在我的sql语句中使用(nolock),因为我无法更改软源。所以我在思考在启动事务的sql进程中启用脏读。

它确实在访问锁定表的语句中执行命令“SET ISOLATION LEVEL ...”和“WITH(NOLOCK)”...这就是我试图避免的。我想在开始事务的语句中启用污垢读取...

提前感谢!

1 个答案:

答案 0 :(得分:1)

  1. 更改写入的隔离级别没有意义,例如插入或更新。写入总是对他们更新的任何内容进行独占锁定。您可以做的是更改读取,SELECT语句的隔离级别。
  2. 脏读是从不必要。 99%的情况下,它们表示错误的架构和查询设计,导致端到端扫描保证在锁定的行上阻塞。解决方案是正确更改架构,添加必要的索引以避免扫描。这不需要更改源。
  3. 对于极少数情况,当争用确实无法避免并且架构设计正确时,答案永远不会启用脏读,而是转向snapshot isolation

    ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON;
     ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;

  4. 对于可以看到快照隔离引入的行版本开销的少数部署,他们可以使用专业人员来解决问题。