2012-07-04 4 views
14

SQL Server의 격리/잠금을 이해하려고합니다. 내가 READ의 시나리오 다음 한READING COMMITTED 격리 수준에서 보류/해제되는 잠금은 언제입니까?

는 격리 수준 (기본)

우리는 테이블이 최선을 다하고. 잠금 그래서 다른 트랜잭션이 .. 행 레벨에 대한 문서도 회담 페이지 수준 데이터 (더티 읽기를 방지) 수정할 수 없습니다 촬영 공유를 선택 해고되면

create table Transactions(Tid int,amt int) 

with some records 

insert into Transactions values(1, 100) 
insert into Transactions values(2, -50) 
insert into Transactions values(3, 100) 
insert into Transactions values(4, -100) 
insert into Transactions values(5, 200) 

지금 MSDN에서 내가

이해 , 테이블 레벨 잠금. 나는 scenarion에게 다음과 같은 생각

입니다 내가 이해 할
Begin Transaction 

select * from Transactions 

/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

공유 잠금이 취득하는 (행, 페이지, 테이블) 될 것이다 시간의 어떤 기간입니다.

진술 문은 select * from Transactions이 실행될 때만 획득되거나 COMMIT에 도달 할 때까지 5 분 이상 획득하게됩니다.

답변

6

잠금은 select * from Transaction

당신은 SQL 세션을 열고 아래 코드

으로 확인할 수 있습니다 실행할 때 획득이 쿼리

Begin Transaction 

select * from Transactions 

WAITFOR DELAY '00:05' 
/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

열기 다른 SQL 세션을 실행하고 쿼리 아래 실행됩니다

Begin Transaction 
Update Transactions 
Set = ... 
where .... 
commit 
19

잘못된 질문 stion, 당신은 구현 세부 사항에 대해 우려하고 있습니다. 당신이 생각하고 걱정해야 할 것은 격리 수준의 의미입니다. 켄드라 리틀은 그 (것)들을 설명하는 좋은 포스터가있다 : Free Poster! Guide to SQL Server Isolation Levels. 항목

Q

에서 선택

*이 : 나는 무엇 항목을 볼 수

귀하의 질문은 같이 다시 표현해야 하는가?
A : 커밋 된 모든 항목

Q : 커밋되지 않은 트랜잭션이 삽입/삭제/업데이트 된 항목이 있으면 어떻게됩니까?
A : 커밋되지 않은 모든 항목이 커밋되거나 롤백 될 때까지 SELECT가 차단됩니다.

Q : 새 항목이 삽입/삭제/업데이트되면 어떻게됩니까? 위 쿼리를 실행합니까?
A : 결과가 결정되지 않았습니다. 수정 사항 중 일부가 표시 될 때까지 수정 사항 중 일부가 표시되고 일부는 표시되지 않으며 가능한 차단 될 수 있습니다.

READ COMMITTED는 트랜잭션의 길이에 관계없이 명령문이 완료되면 약속하지 않습니다. 문장을 다시 실행하면 이전과 똑같은 의미를 다시 갖게되고 이전에 본 적이있는 항목이 변경되고 사라지며 새로운 문장이 나타날 수 있습니다.분명히 이것은 변경 후 수 있습니다 귀하의 선택 후 항목을 만들 수 있습니다.

격리 수준이 높을수록 강력한 보장이 제공됩니다. REPEATABLE READ를 사용하면 커밋 할 때까지 처음 선택한 항목을 수정하거나 삭제할 수 없습니다. SERIALIZABLE은 커밋하기 전에 새 항목을 두 번째 선택 영역에 표시 할 수 없다는 보장을 추가합니다.

구현 메커니즘의 작동 방식에 대한 이해가 필요합니다. 이러한 개념을 숙지 한 후 구현 세부 정보를 요청할 수 있습니다. 그것들은 모두 Transaction Processing: Concepts and Techniques에 설명되어 있습니다.

+0

행 잠금 대신 테이블 잠금을 사용할 때 구현 세부 사항이 중요합니다. – matao

+0

켄들 라 링크가 깨졌습니다. – TinyTheBrontosaurus

6

귀하의 질문에 좋은 것입니다. 취득한 락의 종류를 이해하면 (자), DBMS를 충분히 이해할 수 있습니다. SQL Server에서 모든 격리 수준 (읽기 커밋되지 않음, 읽기 커밋 (기본값), 반복 읽기, 순차 가능)에서 쓰기 작업에 대해 독점 잠금이 획득됩니다.

독점 레벨에 관계없이 트랜잭션이 종료되면 독점 잠금이 해제됩니다.

격리 수준의 차이는 공유 (읽기) 잠금을 획득/해제하는 방식을 나타냅니다.

읽기 권한이없는 격리 수준에서 공유 잠금이 확보되지 않습니다. 이 격리 수준에서 "Dirty Reads"(트랜잭션이 다른 실행중인 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행에서 데이터를 읽을 수 있으므로 롤백 될 수 있음)이라는 동시성 문제가 발생할 수 있습니다.

읽기 커밋 된 격리 수준에서 관련 레코드에 대해 공유 잠금이 획득됩니다. 공유 잠금은 현재 명령이 끝나면 해제됩니다. 이 분리 레벨은 "더티 읽기"를 방지하지만 다른 동시 트랜잭션, "반복 불가능 읽기"(트랜잭션 A가 행을 검색하고 트랜잭션 B가 연속적으로 행을 업데이트하며 나중에 트랜잭션 A가 동일한 행을 다시 검색하는 경우) 트랜잭션 A는 동일한 행을 두 번 검색하지만 다른 데이터를 봅니다) 또는 "Phantom Reads"(트랜잭션 중에 두 개의 동일한 쿼리가 실행되고 두 번째 쿼리에서 반환 된 행 모음이 첫 번째 쿼리와 다릅니다)가 발생할 수 있습니다 .

반복 읽기 하위 수준에서 공유 잠금이 트랜잭션 기간 동안 획득됩니다. "Dirty Reads"및 "Non-Repeatable Reads"는 방지되지만 "Phantom Reads"는 계속 발생할 수 있습니다.

일련 화 가능 격리 수준에서 원거리 공유 잠금이 트랜잭션 기간 동안 획득됩니다. 위에서 언급 한 동시성 문제는 발생하지 않지만 성능이 크게 감소하고 교착 상태가 발생할 위험이 있습니다.