격리 수준

트랜잭션 제어 메커니즘으로 잠금을 사용하면 동시성 문제를 해결할 수 있습니다. 언제든지 둘 이상의 트랜잭션을 실행할 수 있지만, 잠금을 사용하면 모든 트랜잭션을 서로 완전히 격리된 상태로 실행할 수 있습니다. 일치하지 않는 데이터를 승인하도록 트랜잭션을 준비하는 수준을 격리 수준이라고 합니다. 격리 수준을 높이면 데이터의 불일치를 줄일 수 있지만 동시성이 감소하는 단점이 있습니다.

SQL Server Compact에서는 응용 프로그램에 필요한 격리 수준에 따라 SQL Server Compact에서 사용하는 잠금 동작이 결정됩니다.

SQL Server Compact에서는 다음 격리 수준을 지원합니다(가장 낮은 수준에서 가장 높은 수준순).

  • 커밋된 읽기(SQL Server Compact 기본값)

  • 반복 읽기

  • 순차 가능(트랜잭션이 서로 완전히 격리됨)

격리 수준이 높아지면 데이터의 불일치가 감소합니다. 그러나 트랜잭션의 동시성이 줄고 다중 사용자 액세스에 영향을 미칩니다.

참고 참고

SQL Server Compact에서는 하나의 트랜잭션이 다른 트랜잭션의 커밋되지 않은 데이터를 읽을 수 없습니다(커밋되지 않은 읽기). 이러한 기능을 위해서는 사용자가 데이터의 S 잠금을 요청하지 않고 데이터를 읽을 수 있도록 하는 페이지 버전 관리 메커니즘을 사용해야 합니다. 그러므로 읽기(SELECT) 작업에 대해 예외적으로 동시성을 제공합니다.

다음 표에서는 격리 수준 및 각 수준에 해당하는 동시성 문제를 보여 줍니다.

참고 참고

커밋되지 않은 종속성, 일관성이 없는 분석, 가상 읽기 등의 동시성 문제가 발생할 수 있습니다. 동시성 문제에 대한 자세한 내용은 동시성을 참조하십시오.

격리 수준

커밋되지 않은 종속성(커밋되지 않은 읽기)

일관성 없는 분석(반복되지 않는 읽기)

가상 읽기

커밋된 읽기

아니요

반복 읽기

아니요

아니요

순차 가능

아니요

아니요

아니요

격리 수준은 프로그래밍 방식으로 설정하거나 SQL 구문 SET TRANSACTION ISOLATION LEVEL을 사용하여 설정할 수 있습니다. 자세한 내용은 트랜잭션 격리 수준을 참조하십시오.

System.Transaction 의 기본 격리 수준은 Readcommitted입니다. 그러나 기본적으로 트랜잭션 범위 내의 트랜잭션은 격리 수준을 Serializable로 설정하여 실행됩니다. 그러므로 SQL Server Compact 연결이 트랜잭션 범위에 등록된 경우 암시적 트랜잭션(트랜잭션 범위에 대해 내부적으로 만들어진 SQL Server Compact 트랜잭션)이 기본적으로 Serializable 격리 수준에서 실행됩니다. TransactionScope 클래스의 오버로드된 생성자 중 일부는 격리 수준을 매개 변수로 사용하며 암시적 트랜잭션에 대해 서로 다른 격리 수준 값을 지정하는 데 사용되어야 합니다. 지정된 격리 수준을 SQL Server Compact에서 지원하지 않는 경우 SQL Server Compact 연결을 트랜잭션 범위에 등록하면 예외가 발생합니다.

또한 연결 문자열의 일부로 지정되는 default lock timeout 속성은 트랜잭션의 대기 시간을 제어합니다. 그러나 연결이 TransactionScope에 등록된 경우 TransactionScopeTimeSpan이 이 속성을 재정의합니다. 예를 들어 ConnectionString에 1000ms가 default lock timeout의 값으로 포함되었는데 연결이 TransactionScope에 100ms로 등록된 경우 주변 트랜잭션은 1000ms 동안이 아니라 100ms 동안만 지속됩니다. 즉, 응용 프로그램이 보다 긴 트랜잭션 제한 시간을 사용하고 TransactionScope 내에서 명령을 실행하기를 원하는 경우 연결 문자열과 TransactionScopeTimeSpan에 제한 시간 값을 지정해야 합니다.

참고 참고

default lock timeout의 기본값은 2000ms이며 TransactionScope의 기본값은 1분입니다.

표시: