对于SQL Server 2008 R2中的SNAPSHOt隔离级别,MSDN ADO.Net文档中提到了以下内容:
修改数据的事务不会阻止读取数据的事务,而读取数据的事务不会阻止写入数据的事务,就像它们通常在SQL Server中的默认READ COMMITTED隔离级别下一样。
当两个事务都处于SNAPSHOT隔离模式时,没有提到写入是否会阻止写入。所以我的问题如下: 在SNAPSHOT transaction1块中写入是否会写入另一个SNAPHOT transaction2中的相同表?
最新更新
在对我的问题进行了大量思考之后,我将得出如下段所述的结论。希望其他人能够更多地了解这一点。
没有关系数据库,写入不阻止写入。换句话说,写入总是阻止写入。写入包括INSERT或UPDATE或DELETE等语句。无论您使用哪种隔离级别都是如此,因为当数据库中发生多次写入时,所有关系数据库都需要实现数据一致性。当然,同时写入需要冲突(如插入同一个表或更新相同的行),以便发生阻塞。
答案 0 :(得分:5)
Ligos实际上是错误的 - 如果两个单独的事务试图在打开Snapshot的情况下更新同一记录,则事务2将被阻止,直到事务1释放锁。然后,只有那时,你会得到错误3960.我意识到这个帖子已经超过2年了,但我想避免错过信息。
即使链接Ligos引用说的与我上面提到的完全相同(查看最后一个非红色段落)
只有在尝试更新的两个记录(即行)不同时才会阻止写与写
答案 1 :(得分:3)
没有。他们不会阻止。相反,UPDATE
中的trans2
命令将失败,错误编号为3960.
由于SNAPSHOT
隔离级别如何工作,任何UPDATE
命令都可能失败。您可以告诉的唯一方法是捕获并处理错误3960(它被称为乐观并发,因为您不希望这种情况经常发生)。
我最终凭经验测试了这一点,因为从文档中看并不完全明显。 This blog post很好地说明了这一点。
假设:trans1
和trans2
都在同一个表中更新同一行。更新两个不同的行应该可以正常工作。