2009/05/10 15:31
테스트 테이블을 하나 만들었고, 그 테이블에 테스트로 값을 3개를 넣었다.
이제 트랜잭션의 수를 테스트를 해보자.
그럼 이제 롤백을 테스트를 해보자.

에러가 난 이유는 ROLLBACK TRAN은 2번째 트랜잭션까지만 롤백이 될거 같지만, 실제적으로는 1번째 트랜잭션까지 모두 롤백이 되기 때문에, 2번째 롤백은 더 이상 롤백을 할 트랜잭션이 없기때문에 에러가 나는 것이다.
하지만 약간의 쿼리문을 수정을 하면, 원하는 결과가 나온다.
CREATE TABLE testTbl(id INT IDENTITY(1,1));
SELECT * FROM dbo.testTbl;
BEGIN TRAN
BEGIN TRAN
PRINT N'BEGIN 2개 안의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
COMMIT TRAN
PRINT N'BEGIN 1개 안의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
COMMIT TRAN
PRINT N'COMMIT 후의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
BEGIN TRAN
PRINT N'BEGIN 2개 안의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
COMMIT TRAN
PRINT N'BEGIN 1개 안의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
COMMIT TRAN
PRINT N'COMMIT 후의 트랜잭션 수 : '+CONVERT(CHAR(1),@@trancount);
CREATE TABLE #tranTest(id int);
INSERT INTO #tranTest VALUES(0);
INSERT INTO #tranTest VALUES(0);
BEGIN TRAN -- 1번째 트랜잭션
UPDATE #tranTest SET id = 111;
BEGIN TRAN -- 2번째 트랜잭션
UPDATE #tranTest SET id = 222;
SELECT * FROM #tranTest
ROLLBACK TRAN -- 1번째 롤백
SELECT * FROM #tranTest
ROLLBACK TRAN -- 2번째 롤백
SELECT * FROM #tranTest
이 테스트의 결과값은, UPDATE #tranTest SET id = 111;
BEGIN TRAN -- 2번째 트랜잭션
UPDATE #tranTest SET id = 222;
SELECT * FROM #tranTest
ROLLBACK TRAN -- 1번째 롤백
SELECT * FROM #tranTest
ROLLBACK TRAN -- 2번째 롤백
SELECT * FROM #tranTest
하지만 약간의 쿼리문을 수정을 하면, 원하는 결과가 나온다.
CREATE TABLE #tranTest(id int);
INSERT INTO #tranTest VALUES(0);
INSERT INTO #tranTest VALUES(0);
BEGIN TRAN -- 1번째 트랜잭션
UPDATE #tranTest SET id = 111;
SAVE TRAN [tranPoint1]
BEGIN TRAN -- 2번째 트랜잭션
UPDATE #tranTest SET id = 222;
SELECT * FROM #tranTest
ROLLBACK TRAN [tranPoint1] -- 1번째 롤백
SELECT * FROM #tranTest
ROLLBACK TRAN -- 2번째 롤백
SELECT * FROM #tranTest
UPDATE #tranTest SET id = 111;
SAVE TRAN [tranPoint1]
BEGIN TRAN -- 2번째 트랜잭션
UPDATE #tranTest SET id = 222;
SELECT * FROM #tranTest
ROLLBACK TRAN [tranPoint1] -- 1번째 롤백
SELECT * FROM #tranTest
ROLLBACK TRAN -- 2번째 롤백
SELECT * FROM #tranTest
TAG @@trancount,
mssql,
transaction,
트랜잭션