문제

SQL Server 2005의 트랜잭션 격리 수준에 대한 범위 규칙은 무엇입니까? 다른 레벨의 의미를 알고 있지만 수동으로 실행되는 스크립트 외부에 올바르게 적용하는 방법은 아닙니다. 생산 품질 코드에서 실질적으로 사용할 수있는 안내서를 찾을 수 없습니다.

분명히, 범위는 다음과 같은 명령을 사용할 때 시작됩니다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

그러나 어디에서 끝나나요? 저장된 절차에서 ISO 레벨을 설정 한 다음 Proc가 다른 것을 호출하면 중첩 된 Proc가 상속합니까? 더 좋은 점은 중첩 된 Proc 내부의 ISO 레벨을 에스컬레이션하면 전화 Proc로 다시 수행 할 것인가? 시작 TRAN, ROLLBACK 및 COMMIN과 같은 트랜잭션 명령이 차이가 있습니까?

저장된 Proc가 응용 프로그램에 의해 호출되거나 에이전트 작업이 어떤 방식으로 분리 레벨 변경이 지속됩니까? 항상 각 Proc의 끝에 커밋 된 기본 읽기로 되돌아 가야합니까?

다른 상황에서 테스트하지만 현재 격리 수준이 설정된 내용을 읽는 방법을 모르겠습니다.

도움이 되었습니까?

해결책

다음을 실행하고 직접 확인하십시오.

CREATE PROCEDURE dbo.KeepsIsolation
AS
BEGIN
PRINT 'Inside sproc that does not change isolation level';
DBCC USEROPTIONS;
END
GO

CREATE PROCEDURE dbo.ChangesIsolation
AS
BEGIN
PRINT 'Inside sproc that changes isolation level';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DBCC USEROPTIONS;
END
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DBCC USEROPTIONS;
EXEC dbo.KeepsIsolation;
DBCC USEROPTIONS;
EXEC dbo.ChangesIsolation;
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure
    DBCC USEROPTIONS;

다른 팁

에서 MSDN

트랜잭션 격리 수준을 설정하는 경우 저장된 절차에서 또는 트리거, 객체가 반환하면 격리 레벨을 제어합니다. 객체가 호출 될 때 유효 레벨로 재설정됩니다.. 예를 들어, 배치로 반복 가능한 읽기를 설정하고 배치를 한 번 분리 레벨을 직렬화 가능한 것으로 설정하는 저장 프로 시저를 호출하면 저장된 프로 시저가 배치로 제어를 반환 할 때 격리 레벨 설정이 반복 가능한 읽기로 되돌아갑니다.

DBCC USEROPTIONS 다른 모든 세트 옵션과 함께 현재 격리 수준을 표시합니다.

책에서

트랜잭션 격리 레벨 옵션 중 하나만 설정할 수 있으며 한 번에 설정할 수 있으며 명시 적으로 변경 될 때까지 해당 연결을 위해 설정되어 있습니다. 최적화 옵션이 명령문의 From Clause의 테이블 레벨에 지정되지 않는 한 기본 동작이됩니다.

격리 레벨은 거래에 따라 롤백되지 않습니다.

절차와 기능을 호출하더라도 격리 수준은 전류를 유지합니다.

고성능 ADO.NET 연결 풀링이 연결된 경우, 트랜잭션 수준 및 SQLSERVER 2012 이상에 문제가 있습니다.

SQL Server : 풀링 된 연결에서 격리 레벨 누출

https://social.msdn.microsoft.com/forums/sqlserver/en-us/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation-level?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top