쓸만한 주저리

set xact_abort on

봄돌73 2006. 2. 14. 14:15
mssql의 저장 프로시저에서 사용하는 구문이다.

set xact_abort on
begin tran
insert into a values(Ƈ',񟟇')
insert into b values(Ƈ',񟟇')
insert into c values(Ƈ',񟟇')
commit


위와 같은 방법으로 사용하며
여러 개의 insert(update)를 사용할 때
모든 구문이 정상적으로 작동할 때만 디비에 적용이 되며,
그 중 하나라도 오류가 나면 이전에 한 작업들도 되돌려져서
애초에 작업을 하지 않은 것처럼 된다.

아래는 온라인 설명서다.
역시 저작권이 걱정되는 자료다.


SET XACT_ABORT

Transact-SQL 문에서 런타임 오류가 발생할 경우 Microsoft?? SQL Server™가 자동으로 현재 트랜잭션을 롤백하게 할지 여부를 지정합니다.

구문

SET XACT_ABORT { on | OFF }

비고

SET XACT_ABORT 옵션을 on으로 설정하면 Transact-SQL 문에서 런타임 오류가 발생할 경우 전체 트랜잭션이 종료된 후 롤백됩니다. OFF로 설정하면 오류를 발생시킨 Transact-SQL 문만 롤백되고 처리 작업을 계속합니다. 구문 오류와 같은 컴파일 오류는 SET XACT_ABORT 옵션 설정으로 영향을 받지 않습니다.

SQL Server를 포함한 대부분의 OLE DB 공급자에 대한 암시적 또는 명시적 트랜잭션에서 데이터 수정 문에는 XACT_ABORT 옵션을 on으로 설정해야 합니다. 공급자가 중첩 트랜잭션을 지원할 경우에만 이 옵션이 필요하지 않습니다. 자세한 내용은 분산 쿼리 및 분산 트랜잭션을 참조하십시오.

SET XACT_ABORT 옵션은 실행시간이나 런타임에 설정되며, 구문 분석 시간에는 설정되지 않습니다.

예제

다음 예제는 다른 Transact-SQL 문이 있는 트랜잭션에서 외래 키 위반 오류를 발생시킵니다. 첫 번째 명령문 집합에서는 오류가 생성되지만 다른 명령문이 성공적으로 처리되고 트랜잭션이 성공적으로 커밋됩니다. 두 번째 명령문 집합에서는 SET XACT_ABORT 옵션이 on으로 설정됩니다. 이렇게 설정하면 명령문 오류로 인해 일괄 처리가 종료되고 트랜잭션이 롤백됩니다.

CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO

SET XACT_ABORT on
GO

BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO

/* Select shows only keys 1 and 3 added.
Key 2 insert failed and was rolled back, but
XACT_ABORT was OFF and rest of transaction
succeeded.
Key 5 insert error with XACT_ABORT on caused
all of the second transaction to roll back. */

SELECT *
FROM t2
GO

DROP TABLE t2
DROP TABLE t1
GO

'쓸만한 주저리' 카테고리의 다른 글

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  (0) 2006.02.14
set nocount on  (0) 2006.02.14
with (READUNCOMMITTED)  (0) 2006.02.13
<base href='url'>  (0) 2006.02.13
<form>에서 <select> 값을 검증할 때  (0) 2006.02.07