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
에 자물쇠가 있습니까?
이렇게하면 스냅 숏 격리를 지원하고 지원하지 않는 데이터베이스를 서로 조인하는 방법에 대한 또 다른 관련 질문에 대답 할 수 있습니다. 트랜잭션 수준 격리는 조인이 작동 할 수 있도록 (NOLOCK) 또는 (READCOMMITTED)와 같은 테이블 수준 힌트로 재정의 될 수 있습니다. 스냅 샷 격리가있는 테이블의 쿼리 부분은 행 버전 관리를 사용합니다 (즉, 잠그지 않고 해당 테이블에 행을 삽입 할 수 있음). 반면 테이블 힌트가있는 부분은 지정된 격리 수준을 따릅니다. 이는 조인 내에서 분리 레벨을 "혼합"하는 좋은 방법입니다. –
나는 이것에 대해 생각해 보지 못했습니다. 매우 흥미로운 해결책입니다! 테이블 힌트를 사용하여 뷰를 쿼리 할 때 작동하도록 할 수는 있지만 힌트가 어떤 이유로 든 뷰 내부에있을 때는 작동하지 않습니다. SQL Server가 힌트를 따르기로 결정했는지 여부에 따라 달라질 수 있는지 궁금합니다. 어쨌든, 공유 주셔서 감사합니다! – Soukai