문제

MSDN을 통해 읽었습니다 롤백 거래 그리고 중첩 거래. 내가 요점을 보는 동안 ROLLBACK TRANSACTION savepointname, 난 이해가 안 돼요 ROLLBACK TRANSACTION transactionname.

  1. 그것은 단지 작동합니다 transactionname 가장 바깥 트랜잭션입니다
  2. ROLLBACK 경우를 제외하고는 항상 전체 트랜잭션 "스택"을 롤백합니다. savepointname

기본적으로 저장 포인트의 경우를 제외하고 문서를 읽을 때 ROLLBACK 모든 트랜잭션을 롤백합니다 (TO @@TRANCOUNT=0). 내가 볼 수있는 유일한 차이점은이 스 니펫입니다.

외부 트랜잭션의 이름을 사용하는 롤백 트랜잭션 트랜잭션 _name 명령문이 중첩 된 트랜잭션 세트의 모든 수준에서 실행되는 경우 중첩 된 거래 롤백됩니다. Transaction_Name 매개 변수가없는 롤백 작업 또는 롤백 트랜잭션 명세서가 중첩 된 트랜잭션 세트의 모든 수준에서 실행되는 경우 가장 바깥 쪽 트랜잭션을 포함하여 중첩 트랜잭션을 모두 롤백합니다.

독서에서 이것은 이름이 지정된 트랜잭션 (가장 바깥 트랜잭션의 이름이어야 함)을 롤백하면 중첩 트랜잭션 만 롤백됩니다. 이것은 이름이 지정된 트랜잭션을 롤백하는 데 약간의 의미를 부여합니다. 그래서 시험을 설정했습니다.

CREATE TABLE #TEMP (id varchar(50))

INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT

BEGIN TRAN OUTERTRAN

INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT

BEGIN TRAN INNERTRAN

INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT

ROLLBACK TRAN OUTERTRAN

IF @@TRANCOUNT > 0 ROLLBACK TRAN

SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT

DROP TABLE #TEMP

결과 (모든 "X Row (S) 영향을받는"물건이 제거됨)

NOTRAN
--------------------------------------------------
NO

NOTRAN_TRANCOUNT
----------------
0

OUTERTRAN
--------------------------------------------------
NO
OUTER

OUTERTRAN_TRANCOUNT
-------------------
1

INNERTRAN
--------------------------------------------------
NO
OUTER
INNER

INNERTRAN_TRANCOUNT
-------------------
2

AFTERROLLBACK
--------------------------------------------------
NO

AFTERROLLBACK_TRANCOUNT
-----------------------
0

존재한다는 점에 유의하십시오 차이 없음 변경할 때 출력에

ROLLBACK TRAN OUTERTRAN

간단히

ROLLBACK TRAN

그래서 요점은 무엇입니까? ROLLBACK TRANSACTION 명명 된_transaction?

도움이 되었습니까?

해결책

저장 점은 이름에서 알 수있는 것과 정확히 같습니다 : 로그 시퀀스의 '포인트 저장'. 로그 시퀀스는 항상 선형입니다. 저장 포인트로 롤백하면 롤백 모든 것 거래는 현재 로그 위치와 저장 포인트간에 수행되었습니다. 당신의 예를 고려하십시오 :

LSN 1: BEGIN TRAN OUTERTRAN
LSN 2: INSERT INTO ...
LSN 3: BEGIN TRAN INNERTRAN
LSN 4: INSERT INTO ...
LSN 5: ROLLBACK TRAN OUTERTRAN

로그 시퀀스 번호 (LSN)에서 1 OUTERTRAN 저장 지점이 생성됩니다. 첫 번째 삽입은 LSN 2를 만듭니다. 그러면 내부는 LSN 3으로 저장 지점을 만듭니다. 두 번째 삽입은 새로운 LSN, 4를 만듭니다. 롤백 외곽 란은 'LSN 1까지의 롤백 로그'와 같습니다. 로그의 부분을 '건너 뛰기'할 수 없으므로 LSN 1 (저장 포인트 OUTERTRAN이 생성 된 경우)이 발생할 때까지 로그의 모든 작업을 롤백해야합니다.

반면에 마지막 작업에서 롤백 내부를 발행하면 엔진이 LSN 3 ( 'InnerTran'저장 지점이 로그에 삽입 될 때까지 엔진이 롤백됩니다) 따라서 LSN 1 및 LSN 2 (예 : 첫 번째 삽입물) ).

저장 포인트의 실질적인 예는 참조하십시오 예외 처리 및 중첩 거래.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top