2016-09-30 3 views
0

Set Allow Snapshot Isolation = TRUE 인 SQL Server 2012 데이터베이스가 있습니다. DBSnap이라고합시다.SQL Server 격리 수준이보기에서 어떻게 작동합니까?

Set Allow Snapshot Isolation = FALSE과 다른 데이터베이스가 있습니다. DBRead이라고합시다. 나는 다음과 같은 명령을 실행하면

Create View DBReadTable 
as 
    Select * 
    from DBRead.dbo.DBReadTable. 

, 그들은 실패 :

set transaction isolation level snapshot 

Select * 
from DBRead.dbo.DBReadTable 
DBSnap에서

, 난 (참조의 편의를 위해 같은 이름이라고도 함) DBREAD의 테이블에 뷰를 만들었습니다

오류 : 나는이 명령을 실행하는 경우에는

Msg 3952, Level 16, State 1, Line 2
Snapshot isolation transaction failed accessing database 'DBRead' because snapshot isolation is not allowed in this database. Use ALTER DATABASE to allow snapshot isolation.

그것은 작동

set transaction isolation level snapshot 

Select * 
from DBSnap.dbo.DBReadTable 

: 기본적으로 DDSnap에서보기를 형성하는 DBRead 데이터베이스에서 테이블을 액세스 할 수 있습니다.

두 번째 인스턴스에서 실제로 어떤 현상이 발생합니까?

DBRead의 테이블에 대해 행 버전 지정이 DBSnap (즉, DNSnap보기에 행 버전 정보가 있습니까?)입니까?

또는 테이블 DBRead에 자물쇠가 있습니까?

는 내 말에이 문제를 재현 할 수 없습니다

답변

0

그램 블랙을 주셔서 감사합니다. 나는 2012 년 대신 SQL Server 2016을 실행하고 있습니다. 제안한대로 뷰를 만들려고했는데 데이터베이스를 직접 쿼리 한 것과 같은 오류가 발생했습니다.

Msg 3952, Level 16, State 1, Line 2 
Snapshot isolation transaction failed accessing database 'DBRead' because snapshot isolation is not allowed in this database. Use ALTER DATABASE to allow snapshot isolation. 
다음 MSDN 견적 당신이 설명하는 문제가 발생하지 않도록 지정 것으로 보인다

:

If a transaction using the SNAPSHOT isolation level accesses data in multiple databases, ALLOW_SNAPSHOT_ISOLATION must be set to ON in each database.

(https://msdn.microsoft.com/en-us/library/ms173763(v=sql.110).aspx에서) 당신 수도, 두 개의 새로운 데이터베이스로 시작하는 스냅 숏 격리를 가능하게 시도 그 중 하나를 선택하고 위에서 설명한 프로세스를 수행하여 동일한 결과를 얻는 지 확인하십시오. 그렇다면 사용하고 질문을 업데이트 한 SQL을 저장하십시오. 그렇게하면 다른 사람들이 당신의 상황을 복제하는 데 더 좋은 행운을 누릴 수 있습니다.

0

내 게시물이 잘못되었습니다. 테스트 할 때 사용했던 뷰가 스냅 샷을 오버라이드하여 (NOLOCK) 임베디드 된 것을 알지 못했습니다.

+1

이렇게하면 스냅 숏 격리를 지원하고 지원하지 않는 데이터베이스를 서로 조인하는 방법에 대한 또 다른 관련 질문에 대답 할 수 있습니다. 트랜잭션 수준 격리는 조인이 작동 할 수 있도록 (NOLOCK) 또는 (READCOMMITTED)와 같은 테이블 수준 힌트로 재정의 될 수 있습니다. 스냅 샷 격리가있는 테이블의 쿼리 부분은 행 버전 관리를 사용합니다 (즉, 잠그지 않고 해당 테이블에 행을 삽입 할 수 있음). 반면 테이블 힌트가있는 부분은 지정된 격리 수준을 따릅니다. 이는 조인 내에서 분리 레벨을 "혼합"하는 좋은 방법입니다. –

+0

나는 이것에 대해 생각해 보지 못했습니다. 매우 흥미로운 해결책입니다! 테이블 힌트를 사용하여 뷰를 쿼리 할 때 작동하도록 할 수는 있지만 힌트가 어떤 이유로 든 뷰 내부에있을 때는 작동하지 않습니다. SQL Server가 힌트를 따르기로 결정했는지 여부에 따라 달라질 수 있는지 궁금합니다. 어쨌든, 공유 주셔서 감사합니다! – Soukai