我找不到有关其SNAPSHOT ISOLATION
功能的详细信息。我在 SQL Server 2019 上测试了以下查询(禁用了 ADR):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
WAITFOR DELAY '00:00:20'; -- insert of one record to dbo.MARA_CT in different session
SELECT
*
FROM dbo.MARA_CT AS mc;
WAITFOR DELAY '00:00:20'; -- insert of one record to dbo.Album in different session
SELECT
*
FROM dbo.Album AS a;
WAITFOR DELAY '00:00:20';
SELECT
*
FROM dbo.MARA_CT AS mc;
SELECT
*
FROM dbo.Album AS a;
COMMIT;
正如评论中所述,我在 中插入了一行,dbo.MARA_CT
而在第二个 中WAITFOR DELAY
,我在 中插入了一条记录dbo.Album
。根据Microsoft文档:
The term "snapshot" reflects the fact that all queries in the transaction see the same version, or snapshot, of the database, based on the state of the database at the moment in time when the transaction begins.
我的查询得到的结果如下:
dbo.MARA_CT
包含在第一个 WAITFOR DELAY‘00:00:20’期间插入的记录。dbo.Album
不包含在第二个 WAITFOR DELAY‘00:00:20’期间插入的记录。
在我看来,查询中任何表的“首次接触”都会为整个事务创建一个“快照”,而不是捕获事务开始时数据库的状态。关于SNAPSHOT ISOLATION
,我还有其他问题:
SNAPSHOT ISOLATION 会存储数据库中所有行从事务开始的所有版本,还是仅存储查询中使用的表的版本?这是如何工作的?
如果启用了 RCSI,并且我们随后启用了 SNAPSHOT ISOLATION,SQL Server 是否会在 tempdb 中存储任何新值/版本?
在我的案例中,使用数据库快照的目的
SNAPSHOT ISOLATION
是测试新版本的过程和视图(新模式)。即使涉及的表不断进行插入、更新和删除操作,新旧过程都需要返回相同数量的记录并使用相同的数据。我曾考虑使用数据库快照,但现在发现它SNAPSHOT ISOLATION
可能更有优势,因为数据库上已经启用了 RCSI。