없음 SAVE TRANSACTION
. 나는 이것을 사용하는 경우를 찾지 못했습니다. 나는 어떤 사람들이 그것을 선호한다는 것을 알고 있지만, 내가 일한 곳에서 내가 한 모든 일에서 중첩 된 수준 내에서 발생하는 오류의 개념은 이미 수행 된 모든 작업이 잘못되었다는 것을 암시했다. 를 사용 SAVE TRANSACTION
하면이 스토어드 프로 시저가 호출되기 직전의 상태로 되돌아 가기 때문에 기존 프로세스는 유효하지 않습니다.
에 대한 자세한 내용 SAVE TRANSACTION
을 보려면이 답변의 정보를 살펴보십시오.
하나의 저장 프로 시저에서 3 개의 저장 프로 시저가 시작될 때 롤백하는 방법
SAVE TRANSACTION (강조 추가) SAVE TRANSACTION
에 대한 MSDN 페이지에서 언급했듯이 또 다른 문제 는 동작의 미묘한 차이입니다 .
트랜잭션에서 중복 저장 점 이름이 허용되지만 저장 점 이름을 지정하는 ROLLBACK TRANSACTION 문은 해당 이름을 사용하여 트랜잭션을 가장 최근의 SAVE TRANSACTION으로 롤백합니다 .
즉, 각 저장 프로 시저의 각 저장 지점에 모든 저장 프로 시저의 모든 저장 지점에서 고유 한 이름을 지정해야합니다. 다음 예제는이 점을 보여줍니다.
이 첫 번째 예는 Save Point 이름을 재사용 할 때 발생하는 상황을 보여줍니다. 가장 낮은 수준의 저장 지점 만 롤백됩니다.
IF (OBJECT_ID(N'tempdb..#SaveTranTestA') IS NOT NULL)
BEGIN
DROP TABLE #SaveTranTestA;
END;
CREATE TABLE #SaveTranTestA (SomeVal INT NOT NULL);
BEGIN TRAN; -- start level 1
SAVE TRANSACTION MySavePoint;
SELECT @@TRANCOUNT AS [TranCount]; -- 1
INSERT INTO #SaveTranTestA (SomeVal) VALUES (100);
BEGIN TRAN; -- start level 2
SAVE TRANSACTION MySavePoint;
SELECT @@TRANCOUNT AS [TranCount]; -- 2
INSERT INTO #SaveTranTestA (SomeVal) VALUES (200);
COMMIT; -- exit level 2
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestA;
-- 100
-- 200
ROLLBACK TRANSACTION MySavePoint; -- error occurred; undo actions up to this point
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestA;
-- 100
COMMIT; -- exit level 1
SELECT @@TRANCOUNT AS [TranCount]; -- 0
SELECT * FROM #SaveTranTestA;
-- 100
이 두 번째 예는 고유 한 저장 점 이름을 사용할 때 발생하는 상황을 보여줍니다. 원하는 레벨의 저장 점이 롤백됩니다.
IF (OBJECT_ID(N'tempdb..#SaveTranTestB') IS NOT NULL)
BEGIN
DROP TABLE #SaveTranTestB;
END;
CREATE TABLE #SaveTranTestB (SomeVal INT NOT NULL);
BEGIN TRAN; -- start level 1
SAVE TRANSACTION MySavePointUno;
SELECT @@TRANCOUNT AS [TranCount]; -- 1
INSERT INTO #SaveTranTestB (SomeVal) VALUES (100);
BEGIN TRAN; -- start level 2
SAVE TRANSACTION MySavePointDos;
SELECT @@TRANCOUNT AS [TranCount]; -- 2
INSERT INTO #SaveTranTestB (SomeVal) VALUES (200);
COMMIT; -- exit level 2
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestB;
-- 100
-- 200
ROLLBACK TRANSACTION MySavePointUno; --error occurred; undo actions up to this point
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestB;
-- <no rows>
COMMIT; -- exit level 1
SELECT @@TRANCOUNT AS [TranCount]; -- 0
SELECT * FROM #SaveTranTestB;
-- <no rows>