Sql server 2008 r2 在SQL Server 2008 R2中执行快照隔离级别中的写入块在另一个快照事务中的写入

Sql server 2008 r2 在SQL Server 2008 R2中执行快照隔离级别中的写入块在另一个快照事务中的写入,sql-server-2008-r2,isolation-level,Sql Server 2008 R2,Isolation Level,对于SQL Server 2008 R2中的快照隔离级别,MSDN ADO.Net文档中提到了以下内容: 修改数据的事务不会阻止读取数据的事务,而读取数据的事务也不会阻止写入数据的事务,这与SQL Server中默认的读取提交隔离级别下的情况相同 当两个事务都处于快照隔离模式时,没有提到写入是否会阻止写入。因此,我的问题如下: 是否会在快照事务中写入1块写入另一个SNAPHOT事务中的相同表2? 最新更新 在对我的问题进行了大量思考之后,我得出了一个结论,如下面第段所述。希望其他人能对此有更多的

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

修改数据的事务不会阻止读取数据的事务,而读取数据的事务也不会阻止写入数据的事务,这与SQL Server中默认的读取提交隔离级别下的情况相同

当两个事务都处于快照隔离模式时,没有提到写入是否会阻止写入。因此,我的问题如下: 是否会在快照事务中写入1块写入另一个SNAPHOT事务中的相同表2?

最新更新

在对我的问题进行了大量思考之后,我得出了一个结论,如下面第段所述。希望其他人能对此有更多的了解

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


不,他们不会封锁。相反,
trans2
中的
UPDATE
命令将失败,错误号为3960

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

我最终以经验的方式进行了测试,因为从文档中不完全可以看出这一点。不过这很好地说明了这一点



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

Ligos实际上不正确-如果两个单独的事务试图在快照打开的情况下更新同一记录,则事务2将被阻止,直到事务1释放锁为止。然后,也只有到那时,你才会得到错误3960。我知道这个帖子已经有两年多的历史了,但我想避免遗漏信息

即使是Ligos参考链接也与我上面提到的内容完全相同(查看最后一段非红色)


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

igos-感谢您的回复。两个带插入的快照事务如何?两者都试图插入新行。它们仍然会互相阻止?@Sunil
INSERT
s不应该互相阻止(假设您没有尝试插入相同的主键)@Sunil在读取您的更新后,
INSERT
s不会互相死锁(假设主键不同)。它们可能会在创建新标识键和实际写入数据时暂时阻塞,但不会死锁或阻塞等待表锁<代码>更新s执行。我没有尝试测试
DELETE
s(因为我很少使用它们),但我怀疑它们将类似于
UPDATE
.ligos-再次感谢您的回复。我认为插入一行或几行时,阻塞是无关紧要的。但当向表中插入数千行(比如5000行)时,它将在快照隔离级别阻止其他插入/更新。这就是我们观察到的。博客帖子链接现在已经死了。另请参见: