SET XACT_ABORT ON은 다른 문제고요.

일단 트랜잭션은 시작되면

Commit or Rollback 처리가 되어야 합니다.

Begin Tran

을 햇는데? 조건절을 다 빗나가서 커밋 되지않는다면

트랜잭션이 누적되어(비용 비쌈)

머지않아 서버는 다운??될 겁니다.

조건절에서 전부 예외처리가 된다면 상관없지만

If
else if

에 해당되지 않는 값이 넘어와서

Commit 또는 Rollback 처리를 하지못해서 발생한 문제였습니다.

> ELSE
> BEGIN
> ROLLBACK TRAN;
> RETURN 9;
> END

전의 코드는 if 와 else if의 조건에서 벗어나기 때문에..

커밋 또는 롤백이 수행되지 않았으나..

모든 조건에도 해당되지 않은 경우도 잘못된 처리라고 보고

그 외의 모든 경우에 롤백하고 리턴하는 문장이 추가되었기 때문에

트랜잭션의 시작과 끝이 완료되어 에러가 발생하지 않는 것입니다.

간단한 예로

if문에서

begin은 있는데 end가 없다면 에러가 나는것과 다르지 않습니다.




> Haru 님이 쓰신 글
> ----------------------------------------------------------
> 먼저 빠른 답변 감사합니다.
> 마지막껄
>
> ELSE
> BEGIN
> ROLLBACK TRAN;
> RETURN 9;
> END
> 처럼변경하고 SET XACT_ABORT 를 ON으로 놓으니 안나오긴 하던데영.. 이유가 있나영?
>
> 아니면 문제의 요지를 잘못 알고 있는건가영?
>
>
>
> > Haru 님이 쓰신 글
> > ----------------------------------------------------------
> > OS : Microsoft Windows 2003 Server / Enterprise Server
> > SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
> >
> > 안녕하세여?
> >
> > 아래 프로시져를 실행하면
> >
> > 메시지 266, 수준 16, 상태 2, 프로시저 proc_Insurance_Insert, 줄 0
> > EXECUTE 후 트랜잭션 개수는 COMMIT 또는 ROLLBACK TRANSACTION 문이 없음을 나타냅니다. 이전 개수
=
> 4,
> > 현재 개수 = 5.
> >
> > 라는 메시지가 뜨는데영;
> > 실행은 되는뎅 왜 이런 메시지가 뜨는건가영?
> >
> > SQL은 2005입니다.
> >
> > =============================================================================================
> >
> > set ANSI_NULLS ON
> > set QUOTED_IDENTIFIER ON
> > go
> >
> >
> >
> > ALTER PROCEDURE [dbo].[proc_Insurance_Insert]
> > @intTmpIdx INT,
> > @intIdx INT OUTPUT
> >
> > AS
> >
> > BEGIN
> >
> > SET XACT_ABORT OFF
> > SET NOCOUNT ON
> > BEGIN TRAN
> >
> > DECLARE @intRowNError VARCHAR(25)
> > -- 에러 및 로우 저장
> > DECLARE @intErr INT
> > DECLARE @intRowNum INT
> >
> > SET @intErr = 0
> >
> > INSERT dbo.TBL_INSURANCE
> > SELECT iName, 0, 0, 0, iStartDate, iEndDate, iTour, iTourType, iDay, 0,
> > iWriteDate, iWriteIp, "Y", "N", null, null, @intTmpIdx
> > FROM dbo.TBL_INSURANCE_TEMP A
> > WHERE A.iNumber = @intTmpIdx
> >
> > SET @intRowNError = CAST(@@ERROR AS VARCHAR(12)) + "." + CAST(@@IDENTITY
> > AS VARCHAR(12))
> >
> > SET @intErr = CAST(PARSENAME(@intRowNError, 2) AS INT)
> > SET @intIdx = CAST(PARSENAME(@intRowNError, 1) AS INT)
> >
> > IF (@intRowNum > 0 and @intErr = 0)
> > -- 정상
> > BEGIN
> > UPDATE dbo.TBL_INSURANCE_TEMP
> > SET iChkEnd = "Y"
> > WHERE iNumber = @intTmpIdx
> >
> >
> > COMMIT TRAN;
> > RETURN 0;
> > END
> >
> > ELSE IF (@intIdx < 1 OR @intErr <> 0)
> > -- 에러발생
> > BEGIN
> > ROLLBACK TRAN;
> > RETURN 1;
> > END
> >
> > ELSE IF (@intIdx = 0)
> > -- 데이터 없음
> > BEGIN
> > ROLLBACK TRAN;
> > RETURN 2;
> > END
> >
> > ELSE IF (@intErr <> 0)
> > -- 에러발생
> > BEGIN
> > ROLLBACK TRAN;
> > RETURN 9;
> > END
> >
> > SET NOCOUNT OFF
> >
> > END
> >
> >
> >
> >
>