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

Sun*_*nil 7 isolation-level sql-server-2008-r2

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

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

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

最近更新

在对我的问题进行了大量思考之后,我将得出如下段所述的结论.希望其他人可以对此有所了解.

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

小智 5

Ligos实际上是不正确的 - 如果两个单独的事务试图在Snapshot on的情况下更新相同的记录,则事务2将被阻塞,直到事务1释放锁.然后,只有那时,你会得到错误3960.我意识到这个线程超过2年,但我想避免错过信息在那里.

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

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


lig*_*gos 3

不,他们不会阻止。相反,UPDATE命令trans2将会失败并显示错误号 3960。

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

我最终根据经验对此进行了测试,因为从文档中来看它并不完全明显。不过这篇博文很好地说明了这一点。


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