我的测试表:
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)?
最佳答案
您可以在 SNAPSHOT 隔离级别访问旧版本的数据。
这要求数据库在开始之前启用快照隔离:
ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON
然后连接B
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
select * from Personel
快照隔离存在一些性能考虑因素,因为它会重复读取到 tempdb 中的行。
关于sql-server - 如何根据隔离级别读取原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11538285/