"롤백 트랜잭션이라는 롤백 트랜잭션"의 요점은 무엇입니까?
-
06-07-2019 - |
문제
MSDN을 통해 읽었습니다 롤백 거래 그리고 중첩 거래. 내가 요점을 보는 동안 ROLLBACK TRANSACTION savepointname
, 난 이해가 안 돼요 ROLLBACK TRANSACTION transactionname
.
- 그것은 단지 작동합니다
transactionname
가장 바깥 트랜잭션입니다 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 (예 : 첫 번째 삽입물) ).
저장 포인트의 실질적인 예는 참조하십시오 예외 처리 및 중첩 거래.