我希望在插入或更新期间不会获得任何锁定 命令。
那是错的。即使你已经启用了 RCSI ,作家仍然阻止作家,和 X 锁仍然是获得的。
RCSI
X
RC和RCSI有什么不同 的 读 强> 行为。 在处理悲观的RC时, SELECT 从Tran2将被阻止 X 锁定在A上,同时在RCSI Tran2上工作 SELECT 将不会被阻止,它将被提供A的最后提交版本,即具有A的状态 的 之前 强> Tran1修改了它。
SELECT
然后发生什么取决于你的桌面组织和你的 INSERT 。
INSERT
一些例子。
1)表A是一个堆,你在两个事务中都进行单插入。
在这种情况下你的 INSERT 在Tran2中无论如何都会成功, 是否与您尝试在两个事务中插入的值相同 ,因为在这种情况下服务器获取的是 IX 在桌子上(与...兼容) IX 由Tran1持有), IX 在页面上(也兼容 IX 由Tran1持有,即使它是同一页面),和 X 在RID上(而Tran1有 X 上 另一个 RID),所以没有冲突。
IX
2)表A是聚簇表,您正在尝试插入 同样的新钥匙 在这张表中。
在这种情况下你的Tran2's INSERT 由于两者之间的冲突,将被阻止 X 锁定在同一个键上,第一个由Tran1保持,Sent由Tran2请求并被阻止。
3)表A是聚簇表,您正在尝试插入 不同的钥匙 在这张表中。
Insert2会成功,因为 X 当Tran1持有时,Tran2请求的密钥锁定将被授予 IX 桌子上, IX 在页面上,和 X 上 another 键。
another
让我们说你这样做:
SELECT id FROM customers BEGIN TRAN new_tran UPDATE customers
SET ID ='1' WHERE 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/