트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까? SELECT가 발생하면 첫 번째 매개 변수가 완료되지 않은 동안에는 더 이상 SELECT가 실행되지 않습니다.SQL Server 2005 - 트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까?
감사합니다.
트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까? SELECT가 발생하면 첫 번째 매개 변수가 완료되지 않은 동안에는 더 이상 SELECT가 실행되지 않습니다.SQL Server 2005 - 트랜잭션에서 SELECT를 잠글 수있는 방법이 있습니까?
감사합니다.
확실하지 않은 질문이지만 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
물론 장기 실행 트랜잭션은주의하십시오.
+1하지만 : updlock은 실제로 다른 선택이 실행되는 것을 막지 않습니다. 그것은 다른 updlocks을 방지, 이것은 업데이 트를 의미하고 updlocks로 선택합니다. –
좋습니다, 대신 다음과 같이 시도하십시오. select * from mytable with (holdlock, xlock) 이는 다른 연결의 컨텍스트에서 발생하는 SELECT를 확실히 차단합니다. – Garrett
당신은 SERIALIZABLE
의 격리 수준이 필요합니다 힌트의 Isolation Level instead
보고 할 수 있습니다 : 트랜잭션이 경우 완료 될 때까지
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
다른 SELECT
쿼리 차단합니다. 기본 레벨은 대개 READ COMMITTED입니다.
비관적 인 잠금 전략을 찾고 있지만 실제로 데이터를 잠그지 않은 것 같습니다. SQL Server에서 Application locks을 조사하십시오.
격리 수준을 변경하는 것이 일반적으로 최선의 선택입니다.
하지만, 당신을 위해 옵션이 아니라 그 어떤 이유로 든 경우 - ... 당신은 또한 독점 테이블 잠금을 할 수있는 트랜잭션이 완료 될 때까지 테이블에 다른 선택을 방지 할 수select * from MyTable with (tablockx)
.
왜이 작업을 원하십니까? – tpdi
"트랜잭션에서 SELECT 잠금"? 그렇지 않다면 트랜잭션에 있음을 감지하고 있습니까? 또는 "트랜잭션에서 일련 번호를 순차적으로 실행합니다 - 다른 트랜잭션을 시작하기 전에 완전히 실행하십시오"는 의미입니까? 내가 생각하는 유일한 방법은 그것이 작동하는 것입니다. – dkretz