트랜잭션 격리 수준 사용자 지정
READ COMMITTED는 Microsoft SQL Server 데이터베이스 엔진의 기본 격리 수준입니다. 응용 프로그램을 다른 격리 수준에서 실행해야 하는 경우 다음과 같은 방법으로 격리 수준을 설정할 수 있습니다.
SET TRANSACTION ISOLATION LEVEL 문을 실행합니다.
System.Data.SqlClient 관리 네임스페이스를 사용하는 ADO.NET 응용 프로그램에서는 SqlConnection.BeginTransaction 메서드를 사용하여 IsolationLevel 옵션을 지정할 수 있습니다.
ADO를 사용하는 응용 프로그램에서는 Autocommit Isolation Levels 속성을 설정할 수 있습니다.
OLE DB를 사용하는 응용 프로그램에서는 트랜잭션을 시작할 때 isoLevel을 원하는 트랜잭션 격리 수준으로 설정하고 ITransactionLocal::StartTransaction을 호출할 수 있습니다. 자동 커밋 모드에서 격리 수준을 지정할 때 OLE DB를 사용하는 응용 프로그램에서는 DBPROPSET_SESSION 속성인 DBPROP_SESS_AUTOCOMMITISOLEVELS를 원하는 트랜잭션 격리 수준으로 설정할 수 있습니다.
ODBC를 사용하는 응용 프로그램에서는 SQLSetConnectAttr를 사용하여 SQL_COPT_SS_TXN_ISOLATION 특성을 설정할 수 있습니다.
트랜잭션 격리 수준을 설정하는 방법은 트랜잭션 격리 수준 조정을 참조하십시오.
격리 수준을 지정하면 SQL Server 세션에서 모든 쿼리와 DML(데이터 조작 언어) 문의 잠금 동작이 해당 격리 수준에서 작동합니다. 세션이 종료되거나 격리 수준을 다른 수준으로 설정할 때까지 해당 격리 수준이 적용됩니다.
다음 예에서는 SERIALIZABLE 격리 수준을 설정합니다.
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT BusinessEntityID
FROM HumanResources.Employee;
GO
필요에 따라 테이블 수준 힌트를 지정하여 개별 쿼리나 DML 문에 대해 격리 수준을 무시할 수 있습니다. 테이블 수준 힌트를 지정해도 세션의 다른 문에는 영향을 주지 않습니다. 꼭 필요한 경우에만 테이블 수준 힌트를 사용하여 기본 동작을 변경하는 것이 좋습니다.
데이터를 읽을 때 공유 잠금을 요청하지 않는 수준으로 격리 수준이 설정된 경우에도 데이터베이스 엔진에서 잠금을 획득해야 할 수 있습니다. 예를 들어 커밋되지 않은 읽기 격리 수준에서 실행되는 트랜잭션은 데이터를 읽을 때 공유 잠금을 획득하지 않지만 시스템 카탈로그 뷰를 읽을 때 잠금을 요청하는 경우도 있습니다. 즉 동시 트랜잭션이 해당 테이블의 메타데이터를 수정할 때 커밋되지 않은 읽기 트랜잭션이 테이블 쿼리를 차단할 수 있습니다.
현재 설정된 트랜잭션 격리 수준을 확인하려면 다음 예와 같이 DBCC USEROPTIONS 문을 사용합니다. 이 결과 집합은 사용 중인 시스템의 결과 집합과 다를 수 있습니다.
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
DBCC USEROPTIONS;
GO
결과 집합은 다음과 같습니다.
Set Option Value
---------------------------- -------------------------------------------
textsize 2147483647
language us_english
dateformat mdy
datefirst 7
... ...
Isolation level repeatable read
(14 row(s) affected)
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.