2014-02-27 2 views

답변

2

거래는 TRY CATCH 경계를 존중하지 않습니다. COMMIT 또는 ROLLBACK이 발생하면 트랜잭션이 닫히고 TRY 블록 내부 또는 외부에서 트랜잭션이 시작되었습니다. MSDN @

Best practice is to keep your transaction as short as posssible. With this rule, I will prefer 2nd approach.

굉장 기사 ... 추상적 인 트랜잭션을 분류, try 블록에서 발생하는 오류 ..If

는 "현재 트랜잭션의 상태가 무효화됩니다 여기에있다 일반적으로 TRY 블록 외부의 트랜잭션을 종료하는 오류로 인해 TRY 블록 내부에서 오류가 발생하면 트랜잭션은 커밋 불가능 상태가되고 커밋 할 수없는 트랜잭션은 읽기 작업 또는 ROLLBACK TRANSACTION 만 수행 할 수 있습니다. 트랜잭션은 실행할 수 없습니다 쓰기 작업을 생성하는 모든 Transact-SQL 문 예외가 try 블록 내에서 발생하는 경우 N 또는 "...

In your example 1. There is an issue

BEGIN TRAN 
BEGIN TRY 
    -- Code here 
END TRY 
BEGIN CATCH 
ROLLBACK 
END CATCH 
COMMIT 

을 트랜잭션을 COMMIT, 트랜잭션은 catch 블록에서 롤백됩니다. 이 단계가 끝나면 커밋 할 열려있는 트랜잭션이 없다는 예외가 트리거됩니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 가독성을 위해 첫 번째 옵션의 try 블록 내에서 Commit으로 이동하지만 두 번째 옵션은 구현 중입니다. – crazyDiamond

0
BEGIN TRY 


    -- Do the obvious checks 1st if something isnt correct raise error and 
    -- get out of try block, A transaction will never begin 
     IF (Some Condition 1) 
     BEGIN 
     RAISERROR('Something gone Wrong',16,1) 
     END 

     IF (Some Condition 2) 
     BEGIN 
     RAISERROR('Something gone Wrong',16,1) 
     END 

--if nothing has gone wrong ... 
-- Now open a transaction 

    BEGIN TRANSACTION 

    -- Code here 

    COMMIT TRANSACTION --<-- If nothing goes wrong commit 
END TRY 

BEGIN CATCH 
IF @@TRANCOUNT <> 0 
BEGIN 
    ROLLBACK TRANSACTION 
END 


    SELECT ERROR_LINE(), 
      ERROR_MESSAGE(), 
      ..... Other Error fucntion to collect information 
      -- about error 

END CATCH 

모든 즉 오류가 발생하거나 오류 제기를 havent 나던 SQL 서버, 잘된다면 컨트롤이 TRY BLOCK에있을 때. 컨트롤은 CATCH BLOCK을 입력하지 않으므로 내부에서 트랜잭션을 수행해야합니다. TRY Block.