【问题标题】:Isolation level and DIRT READ SQL SERVER 2005 (advanced question)隔离级别和 DIRT READ SQL SERVER 2005(高级问题)
【发布时间】:2011-02-09 17:48:32
【问题描述】:

我将描述我的问题以便于解释:

我有一个表,我的软件正在使用事务访问它(更新、插入)。

问题是我想在这个表中启用 DIRT READ。但是我不能在我的 sql 语句中使用 with (nolock),因为我不能更改软源。所以我想在开始事务的 sql 进程中启用脏读。

它看到命令“SET ISOLATION LEVEL ...”和“WITH(NOLOCK)”在访问锁定表的语句中执行......这是我试图避免的。我想在开始交易的语句中启用脏读...

提前致谢!

【问题讨论】:

  • 您真的要允许脏读吗?还是要允许插入/更新未阻止的读取?

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


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

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

对于少数可见快照隔离引入的行版本控制开销的部署,他们有专业人员可以缓解问题。

【讨论】:

  • READ_COMMITTED_SNAPSHOT 的问题是我无法执行它,因为“在 ALTER DATABASE 完成之前,数据库中必须没有其他打开的连接。”,所以我正在尝试一些替代方案。 ..虽然我的软处理数据,但执行了很多更新和插入。而这个过程只有在它完全完成后才能停止。但是我不能长时间锁定我的桌子,这就是我想做脏读的原因......
  • #3 中的语句只需要执行一次,而不是每次!你不能等到所有人都离开服务器吗?
  • ALTER DATABASE ... WITH ROLLBACK AFTER N SECONDS;.. WITH ROLLBACK IMMEDIATE,它将踢出(中断连接)现有用户。您应该在确保在非高峰时段不中断活动并通知即将中断的受影响用户之后执行此操作。
  • 谢谢 Remus 和大家,这个解决方案解决了我的问题!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2018-02-02
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多