SQL Server에서 트랜잭션의 격리 수준과 더티 리드, 비반복 리드, 팬텀 리드 등과 (코드 인자 및 시간 순서) 간의 관계
데이터베이스에 동시 접근할 때 발생할 수 있는 이러한 문제를 이해하면, 우리는 데이터베이스 격리 수준 개념을 쉽게 이해할 수 있습니다: 동시 거래를 어떻게 그리고 어느 정도까지 격리할 것인가? 예를 들어, 더티 리드를 허용하거나 동시 트랜잭션에 더티 리드가 발생하지 않도록 설정하면 이 격리 레벨을 설정해 동시 트랜잭션 간의 격리를 느슨하거나 심각하게 만들 수 있습니다.
격리 수준이 높을수록 더러운 데이터나 불완전한 데이터를 읽을 확률이 낮지만, 고동시성 시스템에서 성능 저하가 더 심각합니다. 격리 수준이 낮을수록 동시 시스템의 성능 향상이 더 크지만, 데이터 자체는 불완전할 수 있습니다.
SQL Server 2012에서는 트랜잭션의 격리 수준(낮은 순서부터 높은 순서)을 다음과 같은 문법으로 설정할 수 있습니다:
트랜잭션 격리 수준 설정 { 읽기: 미정답 | 읽기 전부 | 반복 읽기 가능 | 스냅샷 | 직렬화 가능 } [ ; ] 먼저, 새로운 테스트 스크립트를 만들고 데이터베이스를 생성한 후 테스트 데이터를 삽입하세요. 다음과 같습니다:
새 창 A 생성트랜잭션을 열고 업데이트 작업을 수행한 후 10초 후 커밋하는 코드는 다음과 같습니다:
새 창 B 생성, 트랜잭션을 READ UNCOMMITTED(미커밋 읽기, 가장 낮은 수준)로 설정하세요. 쉬운 문제는 더티 리딩으로, 다른 트랜잭션이 수정한 데이터를 읽을 수 있지만 커밋되지 않은 경우입니다. 트랜잭션에서 SELECT 문장 객체 테이블에 NOLOCK을 설정하는 것과 같은 역할을 합니다. 데이터를 조회하면 코드는 다음과 같습니다:
새 창 생성 C, 데이터를 직접 쿼리하여, 다음과 같이 :
그 결과,창 A, B, C를 실행해 보면 데이터를 업데이트할 때 창 B가 즉시 데이터를 반환할 수 있습니다 (읽기 데이터가 더티 데이터일 가능성도 있습니다) C 윈도우는 A 윈도우가 실행이 완료될 때까지 기다려야 합니다아래 그림과 같이 데이터를 반환합니다:
(창문 B)
(창문 C)
(끝)
|