2016-10-14 1 views
3

특정 교착 상태 시나리오를 증명하고 진행 상황에 대한 통찰력을 요구하는 테스트 사례를 설정하고 있습니다. 나는 conapiently HeapTable이라고하는 힙 테이블을 가지고있다. 이 테이블은 simulateously 2 트랜잭션에 의해 업데이 트됩니다.UPDATE 힙 테이블 - RID 교착 상태

거래 1 :

BEGIN TRAN 

UPDATE HeapTable 
SET FirstName = 'Dylan' 
WHERE FirstName = 'Ovidiu'; 

WAITFOR DELAY '00:00:15'; 

UPDATE HeapTable 
SET FirstName = 'Bob' 
WHERE FirstName = 'Thierry'; 

ROLLBACK TRANSACTION 

거래 2 :

BEGIN TRAN 

UPDATE HeapTable 
SET FirstName = 'Pierre' 
WHERE FirstName = 'Michael'; 

ROLLBACK TRAN 

나는 첫 번째 트랜잭션 1, 예상 거래 한 일부 단독 잠금을 주장 할 것이다 가깝게 거래 2. 다음에 해고 , 독점적 인 의도와 함께. 나는 이것이 하나의 지적 생각하기 때문에,

spid dbid ObjId  IndId Type Resource  Mode Status 
55 5  711673583 0  RID  1:24336:10 X  GRANT 
57 5  711673583 0  RID  1:24336:10 U  WAIT 

내가 두 번째 트랜잭션이 같은 RID의 업데이트 잠금을 요청 볼 가지 놀랐습니다 : 트랜잭션 2는 RID에 와서 같은의 업데이트 잠금을 요청합니다 & 두 업데이트 문은 서로 다른 데이터를 처리합니다. 어떻게 든 페이지 수준에서 충돌을 기대하고있었습니다. 두 번째 트랜잭션이 업데이트가 필요한 이유

는 거래의 두 번째 업데이트 트랜잭션이 1 차기 트랜잭션의 트랜잭션이 & 완료 롤백의 결과로 교착 상태로 볼 수 언제 1.

누군가 나를 설명 할 수 다른 레코드를 업데이트해도 동일한 RID에서 잠글 수 있습니까?

+0

에 대한 정보를 심층적으로 다룬 내용은이 DBA의 질문은 DBA.SE에 있어야 하는가? – ajeh

+0

@ajeh는 항상 둘 사이의 선이 다소 흐릿하다는 것을 발견했습니다. 더 많은 목적이있을 것이라고 생각되면 거기에 게시하겠습니다. – Jens

+0

여기가 완벽합니다. 걱정 마. – Will

답변

2

다른 레코드를 업데이트해도 두 번째 트랜잭션에서 동일한 RID에 대한 업데이트 잠금이 필요한 이유를 설명 할 수 있습니까?

이 같이 다시 표현 될 수있다

, UPDATE 문에 인덱스가없는 존재 ..

SQL이 페이지에 대한 의도 배타 잠금을 소요하고 U을하려고 업데이트해야합니다 테이블에 잠금을 획득하는 방법 읽기 전에 페이지의 행을 잠글 때 업데이트 될 값과 일치하면이 잠금이 X 잠금으로 변환됩니다.

이 U 잠금 전략은 다른 호환되지 않는 잠금 같은 행에 걸릴 것입니다

아래 링크를 참조하십시오 K ALEN 딜레이 니는 같은

http://sqlblog.com/blogs/kalen_delaney/archive/2009/11/13/update-locks.aspx

+0

이렇게 정확하게 이해하면 두 번째 트랜잭션은 페이지에있는 모든 레코드에 대한 업데이트 잠금을 얻으려고 시도하지만 실제로 필요한 레코드를 찾으려고 할 것입니다. – Jens

+0

예, 인덱스가 없으면 각 레코드를 검색하여 찾아야합니다 – TheGameiswar

+0

이 문제를 해결하고 이에 대한 지식을 깊어 주셔서 감사합니다. 너 환상적이야! – Jens