2012-07-18 45 views
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)?

回答

2

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

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

在连接部分B
ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON 

然后

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

select * from Personel 

有一些性能方面的考虑与快照隔离,因为它重复的行读到tempdb中。

Documentation reference

2

SNAPSHOT(又名。行版本控制)。

快照隔离时,连接B将在连接B中启动事务时看到数据(即使您未启动显式事务,但由SELECT语句启动的隐式事务)。见Understanding Row Versioning-Based Isolation Levels

由快照事务执行读操作检索最后 版本已在快照 事务开始时,一直致力于各行的。

快照支持,必须在格兰数据库显式地启用:

ALTER DATABASE <DatabaseName> SET ALLOW_SNAPSHOT_ISOLATION ON;