none
트랜젝션의 고립성에 대해서 질문 드립니다. RRS feed

  • 질문

  • 아래와 같은 StoredProcedure를 여러개의 쓰레드에서 호출 했을 경우

    Transaction의 Isolation속성에 따라 다음과 같은 결과를 얻어야 할 거 같은데 그렇지 않습니다.

    왜 그런걸까요?

    다음은 StoredProcedure 입니다.

    CREATE PROCEDURE [dbo].[spIncBla] 
    @uID BIGINT
    AS
    BEGIN
    SET NOCOUNT ON

    BEGIN TRY
    BEGIN TRAN

    DECLARE @NowValue INT = 0

    SELECT @NowValue = Value
    FROM [dbo].[tBlaValueTable] with(nolock)
    WHERE uID = @uID

    -- 더한 값이 완료 값 이상이라면 실패 반환
    DECLARE @NextValue INT = 0
    SET @NextValue = @NowValue + 1
    IF 5 < @NextValue
    BEGIN
    IF @@TRANCOUNT > 0
    ROLLBACK TRAN
    RETURN
    END

    UPDATE [dbo].[tBlaValueTable] with(rowlock)
    SET Value = @NextValue
    WHERE uID = @uID

    IF @@ROWCOUNT = 0
    BEGIN
    IF @@TRANCOUNT > 0
    ROLLBACK TRAN
    RETURN
    END
    COMMIT TRAN
    END TRY
    BEGIN CATCH
    if @@trancount > 0
    ROLLBACK TRAN
    RETURN
    END CATCH

    SELECT @NextValue
    END

    5개의 Thread가 동시 요청 했을 때 요구되는 결과

    1

    2

    3

    4

    5

    실제 5개의 Thread가 동시 요청 했을 때 나오는 결과

    1

    1

    1

    2

    2

    2015년 12월 11일 금요일 오전 2:57

답변

  • NOLOCK 으로 다른 트랜잭션에서 값을 읽을수 있으므로 순차적인 값이 나오지 않습니다.

    SELECT 구문에서  with(nolock) 을 빼고 트랜잭션 고립화 수준을 변경하고 테스트해보십시오.

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

    트랜잭션 고립화 수준에 대해서는 아래 링크를 확인해보십시오.

    https://msdn.microsoft.com/ko-kr/library/ms173763(v=sql.100).aspx


    Hong-ju

    • 답변으로 표시됨 Bongseon Kim 2015년 12월 15일 화요일 오전 7:12
    2015년 12월 12일 토요일 오후 1:18