2011-05-02 3 views
3

나는 (SQL Server 2008 R2의) 다음과 같은 SQL 블록이있는 경우 : 난에 표시 할 수 fooData에서 삭제 된 데이터를 위해 문 사이에 COMMIT을 명시 할 필요가 있다고 가정하고SQL "DELETE"문 뒤에 "WHERE NOT IN"문이 오는 것은 같은 트랜잭션에있을 수 있습니까?

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    COMMIT 

    BEGIN TRAN 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

두 번째 삭제. 이 올바른지? 이상적으로는이 모든 것이 하나의 트랜잭션에 포함되기를 바랍니다. 예 :

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

내 생각에 두 번째 문장은 첫 번째 삭제 된 데이터를 선택하지 않습니다. 이것은 스토어드 프로 시저의 일부이기 때문에 반환됩니다. 계단식 삭제 또는 가입에 관심이 없습니다.이 방법에 어느 정도 제한됩니다.

답변

3

동일한 거래/세션은 자신의 변경 사항을 볼 수 있습니다. 다른 세션은 에서 이러한 커밋되지 않은 트랜잭션을 볼 수 없습니다이

그래서 당신의 제 2 형태 (한 넓은 트랜잭션)를 사용하는 안전입니다 세션.

+0

빠른 응답 주셔서 감사합니다. 곧 테스트 할 것입니다. – Brian

2

두 번째 예제를 사용할 수 있습니다.

동일한 트랜잭션을 수행 중이므로 이전 작업의 정보에 액세스하고 있습니다.

격리는 other operations cannot access data that has been modified during a transaction that has not yet completed. The question of isolation occurs in case of concurrent transactions (multiple transactions occurring at the same time).이지만 동일한 트랜잭션 인 경우 트랜잭션이 첫 번째 연산의 결과에 액세스 할 수 있고 액세스하게됩니다.

+0

주셔서 감사합니다. – Brian