-- 테이블 생성
CREATE TABLE [dbo].[test1](
[name] [varchar](10) NULL
)
CREATE TABLE [dbo].[test2](
[name] [varchar](5) NULL
)
---테이블생성 끝
begin tran
1번쿼리 : insert into test1 values('21215153135153153135153153') -- varchar(10) 이므로 오류가 남
2번쿼리 : insert into test2 values('444')
if @@error <> 0
rollback tran
Else
commit tran
이런식으로 트랜잭션을 실행하니 1번쿼리는 당연히 오류가 나서 insert 가 안되고
2번 쿼리는 정상적으로 insert 가 되는데요 혹시 둘중에 하나라도 오류가 있으면
둘다 rollback 시킬수 있는 방법 없을까요??
단순하게
begin tran
insert into test1 values('21215153135153153135153153') -- varchar(10) 이므로 오류가 남
if @@error <> 0
rollback tran
return
Else
commit tran
begin tran
insert into test2 values('444')
if @@error <> 0
rollback tran
return
Else
commit tran
이런 방법 말고 는 없을까요?
Comment 5
-
맨즈밤
2013.09.25 10:53
-
minsouk
2013.09.25 14:11
각 문장에 error 가 있는지 체크해서 rollback 하라고 명령하지 않았으니 전체가 rollback 되지 않은것이고,
단순히 begin tran ..... commit tran 안에 있는것은 에러가 나더라도 그 상태로 commit 하라고 enduser 가 프로그램 했으니
그 상태로 commit 하는것이라고 말하는게 좀 더 명확 할듯도 해요~
-
맨즈밤
2013.09.25 14:37
넵.. 부연설명 감사드립니다~~ begin tran ..... commit tran 안의 처리범위에 설명이 맞춰지다 보니 명확하지 않은 부분이 있었던거같네요~
-
군고구마
2013.09.25 15:34
BEGIN TRY
BEGIN TRAN
1번쿼리 : insert into test1 values('21215153135153153135153153') -- varchar(10) 이므로 오류가 남
2번쿼리 : insert into test2 values('444')
COMMIT TRAN
RETURN 0
END TRY
BEGIN CATCH
ROLLBACK TRAN 1
END CATCH
위의 퀴리로 하면 정상이면 0이고 비정상이면 1을 튕깁니다.
BEGIN TRY와 BEGIN CATCH로 오류를 잡아냅니다.
-
alima
2013.09.26 09:05
선배님들 소중한 답변 정말 감사드립니다 ^^
SET XACT_ABORT ON
선언하고 다시 해보시겠어요.
트랜잭션은 문장단위로 처리됩니다. 즉 begin tran ~ commit tran 안에 문장이 2개일경우 하나가 에러가 나도 다른 하나는 수행을 합니다.
트랜잭션 자체를 중단시키려면 SET XACT_ABORT ON을 쓰시면 됩니다.
또는 2005 이상 사용중이시면 TRY/CATCH 문을 통해서 오류처리를 하셔도 됩니다.