격리 수준 이해

JDBC 드라이버 다운로드

트랜잭션은 한 트랜잭션이 다른 트랜잭션에서 격리되는 방법을 정의하는 격리 수준을 지정합니다. 격리란 서로 다른 트랜잭션에 의한 리소스 또는 데이터 수정을 분리하는 것입니다. 격리 수준은 허용되는 동시성 부작용(예: 더티 읽기 또는 가상 읽기)의 관점에서 설명됩니다.

트랜잭션 격리 수준으로 다음 영향을 제어할 수 있습니다.

  • 데이터를 읽을 때 잠금이 수행되는지 여부, 요청되는 잠금 유형.

  • 읽기 잠금이 유지되는 기간.

  • 다른 트랜잭션에서 수정한 행을 참조하는 읽기 작업이 다음을 수행하는지 여부

    • 행의 배타적 잠금이 해제될 때까지 차단됨.

    • 문 또는 트랜잭션이 시작될 때 존재했던 행의 커밋된 버전 검색.

    • 커밋되지 않은 데이터 수정 내용 읽기.

격리 수준 선택

트랜잭션 격리 수준을 선택해도 데이터 수정 내용을 보호하기 위해 획득된 잠금에는 영향을 주지 않습니다. 트랜잭션은 수정하는 모든 데이터에 대해 항상 배타적 잠금을 가져옵니다. 해당 트랜잭션에 설정된 격리 수준에 관계없이, 트랜잭션이 완료될 때까지 해당 잠금을 유지합니다. 읽기 작업의 경우 트랜잭션 격리 수준은 대개 다른 트랜잭션의 영향을 받지 않도록 작업을 보호할 방법을 정의합니다.

격리 수준이 낮을수록 많은 사용자가 동시에 데이터에 액세스할 수 있습니다. 그러나 사용자에게 보일 수도 있는 더티 읽기 또는 손실된 업데이트 등 동시성 영향의 수가 늘어납니다. 반대로 격리 수준이 높을수록 사용자에게 보일 수도 있는 동시성 영향의 유형은 줄어듭니다. 그러나 시스템 리소스가 더 많이 필요하며 한 트랜잭션이 다른 트랜잭션을 차단할 가능성이 높아질 수 있습니다. 적절한 격리 수준을 선택하는 것은 각 격리 수준의 오버헤드와 응용 프로그램의 데이터 무결성 요구 사항 사이의 균형을 맞추는 데 달려 있습니다.

직렬화 가능한 가장 높은 격리 수준에서 트랜잭션은 읽기 작업을 반복할 때마다 정확히 동일한 데이터를 검색할 수 있습니다. 그러나 다중 사용자 시스템의 다른 사용자에게 영향을 줄 수 있는 잠금 수준을 사용합니다. 최하위 격리 수준인 커밋되지 않은 읽기의 경우 다른 트랜잭션에서 수정했지만 커밋되지 않은 데이터를 검색할 수 있습니다. 커밋되지 않은 읽기에서는 모든 동시성 부작용이 발생할 수 있지만 읽기 잠금이나 버전 관리가 수행되지 않으므로 오버헤드가 최소화됩니다.

설명

다음 테이블에서는 서로 다른 격리 수준에서 허용되는 동시성 부작용을 보여 줍니다.

격리 수준 더티 읽기 반복 불가능한 읽기 팬텀
커밋되지 않은 읽기
커밋된 읽기
반복 읽기 아니요 없음
스냅샷 아니요 없음 아니요
직렬화 가능 아니요 없음 아니요

두 트랜잭션이 각기 동일한 행을 검색할 때 발생할 수 있는 업데이트 손실을 방지하려면 반복 읽기 이상의 격리 수준에서 트랜잭션을 실행해야 합니다. 그런 다음 트랜잭션은 원래 검색된 값에 따라 행을 업데이트합니다. 두 트랜잭션이 단일 UPDATE 문을 사용하여 행을 업데이트하고 이전에 검색한 값에 대한 업데이트를 따르지 않는 경우, 커밋된 읽기의 기본 격리 수준에서 업데이트 손실은 발생할 수 없습니다.

트랜잭션 격리 수준을 설정하려면 SQLServerConnection 클래스의 setTransactionIsolation 메서드를 사용할 수 있습니다. 이 메서드는 다음과 같이 연결 상수 중 하나를 기반으로 하는 int 값을 인수로 허용합니다.

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

SQL Server의 새 스냅샷 격리 수준을 사용하려면 다음과 같은 SQLServerConnection 상수 중 하나를 사용합니다.

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);

또는 다음을 사용할 수도 있습니다.

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);

SQL Server 격리 수준에 대한 자세한 내용은 SQL Server 온라인 설명서의 "데이터베이스 엔진 격리 수준"을 참조하세요.

참고 항목

JDBC 드라이버로 트랜잭션 수행
SET TRANSACTION ISOLATION LEVEL(Transact-SQL)