2

我的测试表:

CREATE TABLE [dbo].[Personel](
    [PersonelID] [int] NOT NULL,
    [Name] [nchar](10) NULL,
 CONSTRAINT [PK_Personel] PRIMARY KEY CLUSTERED 
(
    [PersonelID] ASC
)
)

我的测试数据:

insert into Personel
values (1, 'Jack')
, (2, 'John')
, (3, 'Kevin')

连接 A:

begin tran
update Personel
set Name = 'Michael'
where PersonelID = 1

连接 B:

SET TRANSACTION ISOLATION LEVEL ????

SELECT Name 
FROM Personel WITH (????)
where PersonelID = 1

连接 A 启动事务并尝试更新数据,但事务仍在进行中。连接 B 尝试读取正在更新的数据。

有没有办法(隔离级别或提示或这两者的组合)在事务提交或回滚之前查看原始数据(Jack,而不是 Michael)?

4

2 回答 2

2

SNAPSHOT(又名行版本控制)。

在快照隔离下,当 ti 在连接 B 中启动事务时,连接 B 将按原样查看数据(即使您没有启动显式事务,SELECT 语句也会启动隐式事务)。请参阅了解基于行版本控制的隔离级别

快照事务执行的读取操作检索在快照事务启动时已提交的每一行的最后一个版本。

必须在数据库中明确启用 SNAPSHOT 支持:

ALTER DATABASE <DatabaseName> SET ALLOW_SNAPSHOT_ISOLATION ON;
于 2012-07-18T09:45:41.463 回答
2

您可以在 SNAPSHOT 隔离级别访问旧版本的数据。

这要求数据库在开始之前启用快照隔离:

ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON

然后在连接 B

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

select * from Personel

快照隔离有一些性能注意事项,因为它复制了读入 tempdb 的行。

文档参考

于 2012-07-18T09:46:19.507 回答