【问题标题】:SQL Server Read Committed SnapshotSQL Server 读取提交快照
【发布时间】:2017-10-30 22:00:54
【问题描述】:

我只是想知道关于读取提交隔离级别上的快照行为。假设我有一个名为“A”的表。这是第一笔交易:

Select blabla 
From A

Insert Into A blabla

第二笔交易也是如此

Select blabla 
From A

Insert Into A blabla

并假设发生了以下时间线:

Tran1: select
Tran1: insert (not yet committed)
Tran2: select (I don't know it is possible or not)
Tran2: insert

据我所知,在标准的已提交读隔离级别中,由于 tran1 insert 命令尚未提交或回滚,tran2 select 查询将被阻止。但是,虽然启用了“is_read_committed_snapshot”,但我希望在插入或更新命令期间不会获取任何锁。

那么 tran2 会发生什么?

我希望 tran2 选择查询不会看到 tran1 插入的数据,因为它会是“脏读”。但它也不会被阻塞。

由于tran1插入查询没有获取任何锁,这种情况会不会是这两个事务执行并发的问题?

【问题讨论】:

    标签: sql-server concurrency transactions isolation-level


    【解决方案1】:

    我希望在插入或更新期间不会获得任何锁 命令。

    这是错误的。即使您启用了RCSI,写入者仍会阻止写入者,并且仍会获得X 锁。

    RC 和 RCSI 之间的区别在于 阅读 行为。 在悲观 RC 上工作时,来自 Tran2 的SELECT 将在 A 上持有的 X 锁上被阻止,而在 RCSI Tran2 的 SELECT 上工作时不会被阻止,它将与 A 的最后提交版本一起提供,即A 在 Tran1 修改它之前的状态。

    然后会发生什么取决于您的餐桌组织以及您INSERT 的内容。

    一些例子。

    1) 表 A 是一个堆,您在两个事务中都进行单次插入。

    在这种情况下,您在 Tran2 中的 INSERT 在任何情况下都会成功,无论您是否尝试在两个事务中插入相同的值,因为在这种情况下服务器获取的是表上的IX(与Tran1 持有的IX 兼容)、页面上的IX(也与Tran1 持有的IX 兼容,即使它是同一页)和@987654332 @ 在 RID 上(而 Tran1 在 另一个 RID 上有 X),所以没有冲突。

    2) 表 A 是聚簇表,您正试图在此表中插入 相同的新键。

    在这种情况下,您的 Tran2 的 INSERT 将被阻止,因为同一密钥上的两个 X 锁发生冲突,第一个由 Tran1 持有,第二个由 Tran2 请求并被阻止。

    3) 表 A 是聚簇表,您正试图在此表中插入 不同的键。

    Insert2 将成功,因为 Tran2 请求的密钥上的 X 锁定将被授予,因为 Tran1 将IX 保存在表上,IX 在页面上,X 在 another 密钥上。

    【讨论】:

      【解决方案2】:

      假设你是这样做的:

      SELECT id FROM customers
      
      BEGIN TRAN new_tran
      UPDATE customers
      

      SET ID = '1' 其中 ID = '01'

      如果您的查询是这样的:

      SET TRANSACTION ISOLATION LEVEL SNAPSHOT
      GO
      BEGIN TRAN
      SELECT *
      FROM   customers
      WHERE id = '01'
      

      结果 - 即使我们将值更改为 01,我们仍然会在会话 2 (2, TWO) 中看到旧记录。

      现在,让我们在会话 1 中提交事务

      现在假设您在会话 2 中提交了事务,现在您将获得新的更新值:

      COMMIT
      SELECT *
      FROM   DemoTable
      WHERE i = 2
      

      您可以在 Pinal Dave 的博客上阅读更多相关信息:blog.sqlauthority.com/2015/07/03/sql-server-difference-between-read-committed-snapshot-and-snapshot-isolation-level/

      【讨论】:

      • 他的问题是关于 RCSI,而不是关于 SNAPSHOT
      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2019-01-29
      • 1970-01-01
      • 2020-01-08
      • 2014-01-03
      • 1970-01-01
      相关资源
      最近更新 更多