7

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

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

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

最近更新

在对我的问题进行了很多思考之后,我得出了以下段落中提到的结论。希望其他人可以对此有所了解。

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

4

2 回答 2

5

Ligos 实际上是不正确的——如果两个单独的事务试图在 Snapshot 开启的情况下更新同一记录,事务 2 将被阻塞,直到事务 1 释放锁。然后,只有那时,你会得到错误 3960。我意识到这个线程已经有 2 年多了,但我想避免丢失信息。

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

仅当尝试更新的两条记录(即行)不同时,Write vs. Write 才会被阻止

于 2014-10-20T14:50:58.087 回答
3

不,他们不会阻止。相反,输入UPDATE命令trans2将失败,错误号为 3960。

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

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


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

于 2012-10-02T04:44:40.807 回答