SET IMPLICIT_TRANSACTIONS(Transact-SQL)

연결에 대해 암시적 트랜잭션 모드를 설정합니다.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

SET IMPLICIT_TRANSACTIONS { ON | OFF }

주의

SET IMPLICIT_TRANSACTIONS 옵션을 ON으로 설정하면 연결이 암시적 트랜잭션 모드로 설정됩니다. OFF로 설정하면 연결이 다시 자동 커밋 트랜잭션 모드로 돌아갑니다. ANSI_DEFAULTS로 인해 암시적 트랜잭션이 갑자기 ON으로 설정될 수 있습니다. IMPLICIT_TRANSACTIONS = ON이면 명시적 BEGIN TRANSACTION에서 두 개의 중첩 트랜잭션이 시작됩니다.

연결이 암시적 트랜잭션 모드에 있고 현재 트랜잭션에는 없을 경우, 다음 문 중 하나를 실행하면 트랜잭션이 시작됩니다.

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT(아래 예외 참조)

CREATE

INSERT

TRUNCATE TABLE

DELETE

OPEN

UPDATE

DROP

연결이 이미 열려 있는 트랜잭션에 있을 경우에는 문을 실행해도 새 트랜잭션이 시작되지 않습니다.

이 옵션을 ON으로 설정한 결과 자동으로 열린 트랜잭션은 트랜잭션 끝에서 사용자가 명시적으로 커밋하거나 롤백해야 합니다. 그렇지 않으면 사용자가 연결을 끊을 때 트랜잭션과 트랜잭션에 포함된 모든 데이터의 변경 내용이 롤백됩니다. 트랜잭션이 커밋된 후 위의 문 중 하나를 실행하면 새 트랜잭션이 시작됩니다.

연결을 자동 커밋 모드로 되돌리는 SET IMPLICIT_TRANSACTIONS OFF 문을 실행할 때까지는 연결이 계속 암시적 트랜잭션 모드에 있습니다. 자동 커밋 모드에서는 성공적으로 완료된 경우 모든 개별 문이 커밋됩니다.

SQL Server의 SQL Server Native Client OLE DB 공급자와 SQL Server Native Client ODBC 드라이버는 둘 다 연결될 때 IMPLICIT_TRANSACTIONS 옵션을 OFF로 자동으로 설정합니다. SET IMPLICIT_TRANSACTIONS는 SQLClient 관리 공급자와 연결하는 경우와 HTTP 끝점을 통해 SQAP 요청을 받는 경우에는 OFF로 기본 설정됩니다.

SET ANSI_DEFAULTS 옵션이 ON이면 SET IMPLICIT_TRANSACTIONS 옵션이 ON입니다.

SET IMPLICIT_TRANSACTIONS가 ON일 때 BEGIN TRANSACTION 문을 실행하면 두 개의 중첩 트랜잭션이 열립니다. BEGIN_TRANSACTION은 트랜잭션이 활성일 때마다 @@trancount를 증가시킵니다.

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

테이블에서 선택하지 않은 SELECT 문은 암시적 트랜잭션을 시작하지 않습니다. 예를 들어, SELECT GETDATE(); 또는 SELECT 1, 'ABC';에는 트랜잭션이 필요하지 않습니다.

IMPLICIT_TRANSACTION의 현재 설정을 보려면 다음 쿼리를 실행합니다.

DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;

다음 예에서는 명시적으로 시작된 트랜잭션 및 IMPLICIT_TRANSACTIONS가 ON으로 설정되어 암시적으로 시작된 트랜잭션을 보여 줍니다. 이 예에서는 열려 있는 트랜잭션과 닫혀 있는 트랜잭션을 보여 주기 위해 @@TRANCOUNT 함수를 사용합니다.

SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
    DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO

PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));

BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
    + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding transaction.
COMMIT TRANSACTION;
GO

결과 집합은 다음과 같습니다.

Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1

참고 항목

참조

ALTER TABLE(Transact-SQL)

BEGIN TRANSACTION(Transact-SQL)

CREATE TABLE(Transact-SQL)

DELETE(Transact-SQL)

DROP TABLE(Transact-SQL)

FETCH(Transact-SQL)

GRANT(Transact-SQL)

INSERT(Transact-SQL)

OPEN(Transact-SQL)

REVOKE(Transact-SQL)

SELECT(Transact-SQL)

SET 문(Transact-SQL)

SET ANSI_DEFAULTS(Transact-SQL)

@@TRANCOUNT(Transact-SQL)

TRUNCATE TABLE(Transact-SQL)

UPDATE(Transact-SQL)