2014-06-20 3 views
0

내가 SQL 서버 Managemnet 스튜디오 2012행이 차단되지 않는 이유는 무엇입니까?

begin transaction 
Select * 
from tabl1 with(xlock, rowlock) 
where ID = 1153; 

select * from Table2; 
rollback 

이 트랜잭션을 사용하고 난 두 번째 쿼리에 중단 점을 넣어. 첫 번째 쿼리는 트랜잭션이 커밋 또는 롤백되지 않은 상태에서 ID가 1153을있는 Pieza의 열을 차단, 그래서 것이다 SQL 서버 관리 스튜디오의 다른 인스턴스에서 breakpint의 코드 정지, 내가 수행 할 때

select * from Table1 

이 쿼리는 첫 번째 SQL Server 관리 스튜디오의 트랜잭션이 끝날 때까지 기다리고 있지만 문제없이 끝날 수 있다고 생각합니다.

그러나 EF를 사용하는 트랜잭션에서 T-SQL을 수행하면 행이 차단됩니다.

나도 시도 :

는 트랜잭션을 시작 선택 * (xlock에, 노 걸이)와 tabl1에서 경우 ID = 1153; go select *에서 표 2; 롤백

하지만이 방법으로는 문제가 해결되지 않습니다.

관리 스튜디오에서 SQL Server의 힌트를 어떻게 테스트 할 수 있습니까?

감사합니다.

편집 :

이 트랜잭션 블록 행 :

시작 거래 선택 * (xlock에, 노 걸이)와 tabl1에서 ;

select * from Table2; 
rollback 

그래서 ID와 같은 조건을 설정하면 행이 차단되지 않습니다. 에서

답변

1

: http://msdn.microsoft.com/en-us/library/ms187373.aspx

Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on  
index keys rather than the actual data rows. For example, if a table has a nonclustered index,  
and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on  
the index key in the covering index rather than on the data row in the base table. 

는 그래서 인덱스가 첫 번째 쿼리를 만족하지만, (SELECT *)에만 clusterd 지수에 의해 만족 될 수있는 두 번째 것이 될 수있다.

+0

인덱스를 사용하고 색인을 사용하지 않을 경우 어떤 경우에도 행을 차단할 수있는 방법이 있습니까? 감사. –

+1

나는 그것이 당신이하고있는 일에 달려 있다고 생각한다. 선택 항목은 호환 가능한 잠금이며 서로를 차단하지 않습니다. 반면 행을 업데이트하는 경우 select는 해당 작업이 완료 될 때까지 기다려야합니다. 여기에 설명하는 데 도움이되는 멋진 표가 있습니다. http://technet.microsoft.com/en-us/library/ms186396(v=sql.105).aspx –

+0

선택 방법으로 차단해야합니다. 이 행과 관련된 다른 행이 다른 사용자에 의해 업데이트되고 해당 정보가 일관성이 없는지 확인해야합니다. 나는 모두 또는 아무것도 업데이트하지 않아도되는 행 그룹을 가지고 있으며, 참조 행을 차단하는 것이 내가하는 일이라고 생각합니다. 다른 방식으로 행을 차단하기 위해 가짜 업데이트를 수행하기 때문입니다. 그러나 데이터베이스에 대한 또 다른 왕복 여행을하므로이 솔루션이 마음에 들지 않습니다. –

관련 문제