写入SNAPSHOT隔离级别块写入SQL Server 2008 R2中的另一个SNAPSHOT事务

时间:2012-10-02 04:17:58

标签: sql-server-2008-r2 isolation-level

对于SQL Server 2008 R2中的SNAPSHOt隔离级别,MSDN ADO.Net文档中提到了以下内容:

  

修改数据的事务不会阻止读取数据的事务,而读取数据的事务不会阻止写入数据的事务,就像它们通常在SQL Server中的默认READ COMMITTED隔离级别下一样。

当两个事务都处于SNAPSHOT隔离模式时,没有提到写入是否会阻止写入。所以我的问题如下: 在SNAPSHOT transaction1块中写入是否会写入另一个SNAPHOT transaction2中的相同表?

最新更新

在对我的问题进行了大量思考之后,我将得出如下段所述的结论。希望其他人能够更多地了解这一点。

  

没有关系数据库,写入不阻止写入。换句话说,写入总是阻止写入。写入包括INSERT或UPDATE或DELETE等语句。无论您使用哪种隔离级别都是如此,因为当数据库中发生多次写入时,所有关系数据库都需要实现数据一致性。当然,同时写入需要冲突(如插入同一个表或更新相同的行),以便发生阻塞。

2 个答案:

答案 0 :(得分:5)

Ligos实际上是错误的 - 如果两个单独的事务试图在打开Snapshot的情况下更新同一记录,则事务2将被阻止,直到事务1释放锁。然后,只有那时,你会得到错误3960.我意识到这个帖子已经超过2年了,但我想避免错过信息。

即使链接Ligos引用说的与我上面提到的完全相同(查看最后一个非红色段落)

只有在尝试更新的两个记录(即行)不同时才会阻止写与写

答案 1 :(得分:3)

没有。他们不会阻止。相反,UPDATE中的trans2命令将失败,错误编号为3960.

由于SNAPSHOT隔离级别如何工作,任何UPDATE命令都可能失败。您可以告诉的唯一方法是捕获并处理错误3960(它被称为乐观并发,因为您不希望这种情况经常发生)。

我最终凭经验测试了这一点,因为从文档中看并不完全明显。 This blog post很好地说明了这一点。


假设:trans1trans2都在同一个表中更新同一行。更新两个不同的行应该可以正常工作。