2009-04-29 2 views
1

트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까? SELECT가 발생하면 첫 번째 매개 변수가 완료되지 않은 동안에는 더 이상 SELECT가 실행되지 않습니다.SQL Server 2005 - 트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까?

감사합니다.

+2

왜이 작업을 원하십니까? – tpdi

+0

"트랜잭션에서 SELECT 잠금"? 그렇지 않다면 트랜잭션에 있음을 감지하고 있습니까? 또는 "트랜잭션에서 일련 번호를 순차적으로 실행합니다 - 다른 트랜잭션을 시작하기 전에 완전히 실행하십시오"는 의미입니까? 내가 생각하는 유일한 방법은 그것이 작동하는 것입니다. – dkretz

답변

2

확실하지 않은 질문이지만 SQL Server의 기본값보다 더 엄격한 잠금을 적용하려는 경우 격리 수준을 높이거나 잠금 힌트를 사용할 수 있습니다. 처음에 무언가를 선택해야하고 나중에 SELECTED 값을 기반으로 UPDATE를 수행하는 경우 유용 할 수 있습니다. 다른 트랜잭션 (SELECT에서 이전에 선택한 값이 SELECT 및 UPDATE에서 변경된)에서 유령 UPDATE를 피하려면 SELECT 문에 갱신 잠금을 부과 할 수 있습니다.

예 : SELECT 문 위의 더 엄격한 업데이트 잠금 &를 사용하는

select * from mytable with (holdlock, xlock) 

주의 트랜잭션 (transaction)의 기간이 잠금을 보유하고 있습니다. 다음과 같이 명시 적 트랜잭션으로 명세서를 래핑하고 싶을 수도 있습니다.

begin transaction 
select * from mytable with (holdlock, xlock) -- exclusive lock held for the entire transaction 
-- more code here... 
update mytable set col='whatever' where ... 
commit transaction 

물론 장기 실행 트랜잭션은주의하십시오.

+0

+1하지만 : updlock은 실제로 다른 선택이 실행되는 것을 막지 않습니다. 그것은 다른 updlocks을 방지, 이것은 업데이 트를 의미하고 updlocks로 선택합니다. –

+0

좋습니다, 대신 다음과 같이 시도하십시오. select * from mytable with (holdlock, xlock) 이는 다른 연결의 컨텍스트에서 발생하는 SELECT를 확실히 차단합니다. – Garrett

0

보고 할 수 있습니다 : 트랜잭션이 경우 완료 될 때까지

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

다른 SELECT 쿼리 차단합니다. 기본 레벨은 대개 READ COMMITTED입니다.

0

비관적 인 잠금 전략을 찾고 있지만 실제로 데이터를 잠그지 않은 것 같습니다. SQL Server에서 Application locks을 조사하십시오.

0

격리 수준을 변경하는 것이 일반적으로 최선의 선택입니다.

하지만, 당신을 위해 옵션이 아니라 그 어떤 이유로 든 경우 - ... 당신은 또한 독점 테이블 잠금을 할 수있는 트랜잭션이 완료 될 때까지 테이블에 다른 선택을 방지 할 수
select * from MyTable with (tablockx) 

.

관련 문제