2016-05-31 5 views
0

실제로 저장 프로 시저에서 중첩 트랜잭션을 사용하는 것에 대해 혼란스러워합니다. 하나의 주 절차에서 2/3 절차를 호출해야합니다.중첩 된 저장 프로 시저 중첩 트랜잭션

예 :

Begin try 

Begin Tran -- 1st level transcation 

Procedure 1 --will be executed 

Procedure 2 --will be executed 

End tran -- 1st level transcation 
End try 
Begin Catch 
Rollback tran 
End Catch 


PROCEDURE 1: 

BEGIN TRAN TRAN1 
///scripts 
COMMIT TRAN TRAN1 


PROCEDURE 2: 

BEGIN TRAN TRAN2 
///scripts 
COMMIT TRAN TRAN2 

오전 나는 올바른 방법으로 그 일을?

+0

수행하여 외부 절차)

을 변경 사항을 취소? –

+0

TRAN1을 롤백 할 수 없습니다. 해당 이름의 트랜잭션 또는 저장 점이 없습니다. –

답변

0

내부 트랜잭션 커밋은 SQL Server 데이터베이스 엔진에서 무시됩니다. 트랜잭션은 가장 바깥 쪽 트랜잭션의 끝에서 취해진 동작을 기반으로 커밋되거나 롤백됩니다. 외부 트랜잭션이 커밋되면 내부 중첩 트랜잭션도 커밋됩니다. 외부 트랜잭션이 롤백되면 내부 트랜잭션이 개별적으로 커밋되었는지 여부에 관계없이 모든 내부 트랜잭션도 롤백됩니다.

nested transactions 같은 건 없다 링크 https://technet.microsoft.com/en-us/library/ms189336%28v=sql.105%29.aspx

0

을 참조하십시오. 트랜잭션의 일부만 롤백하려면 savepoints을 사용해야합니다. 그때 내가 here에서 템플릿 다음 사용하는 것이 세이브 포인트를 사용한다면 (섹션 Example 참조)

BEGIN TRANSACTION -- A 

SAVE TRANSACTION SavePoint1 -- B 
-- do something 
COMMIT TRANSACTION SavePoint1 -- C 

-- ... 
-- This ROLLBACK will rollback everything including data committed for SavePoint1 - it will rollback also actions for [B,C] range 
ROLLBACK -- D 

: COMMIT TRANSACTION SavepointNameROLLBACK을 실행 한 후이 마지막 ROLLBACK 문은 세이브 포인트로 정의 섹션을 포함 everythint을 롤백 할 경우, 세이브 포인트에 관해서. 1 (0에서 변경 저장)
롤백 TRANSACTION => @@ TRANCOUNT = 0 (-

0

하면 => @@ TRANCOUNT = @@ TRANCOUNT + 1
COMMIT TRANSACTION => @@ TRANCOUNT = @@ TRANCOUNT 트랜잭션 BEGIN 그냥 PROC1 또는 PROC2이 실패하면 어떻게됩니까

BEGIN TRY 
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION 
    .. 
END TRY 
관련 문제