2012-07-18 3 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

당신은 스냅 샷 격리 수준에서 데이터의 이전 버전에 액세스 할 수 있습니다.

다음
ALTER DATABASE <dbname> SET ALLOW_SNAPSHOT_ISOLATION ON 

연결 B에서 스냅 숏 격리 일부 성능 고려 사항이 있습니다

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

select * from Personel 

, 그것은 행을 읽어 복제 때문에 : 시작하기 전에

데이터베이스가 스냅 숏 격리를 사용할 것을 요구한다 tempdb에 저장합니다.

Documentation reference

2

SNAPSHOT (별칭 행 버전).

스냅 샷 격리 상태에서 연결 B는 연결 B에서 트랜잭션을 시작할 때 (즉, 명시 적 트랜잭션을 시작하지 않았더라도 SELECT 문에 의해 시작된 암시 적 트랜잭션이 있음) 데이터를 볼 수 있습니다. Understanding Row Versioning-Based Isolation Levels 참조 : 스냅 샷 트랜잭션에 의해 수행

읽기 작업은 스냅 샷 트랜잭션이 시작되는 시간에 최선을 다하고 있었다 각 행의 마지막 버전을 검색 할 수 있습니다.

스냅 지원은 명시 적으로 TEH 데이터베이스를 활성화해야합니다 :

ALTER DATABASE <DatabaseName> SET ALLOW_SNAPSHOT_ISOLATION ON; 
관련 문제