SET IMPLICIT_TRANSACTIONS(Transact-SQL)
연결에 대해 암시적 트랜잭션 모드를 설정합니다.
구문
SET IMPLICIT_TRANSACTIONS { ON | OFF }
주의
SET IMPLICIT_TRANSACTIONS 옵션을 ON으로 설정하면 연결이 암시적 트랜잭션 모드로 설정됩니다. OFF로 설정하면 연결이 다시 자동 커밋 트랜잭션 모드로 돌아갑니다.
연결이 암시적 트랜잭션 모드에 있고 현재 트랜잭션에는 없을 경우, 다음 문 중 하나를 실행하면 트랜잭션이 시작됩니다.
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 옵션은 실행 시간 또는 런타임에 설정되며, 구문 분석 시에는 설정되지 않습니다.
예
다음 예에서는 명시적으로 시작된 트랜잭션 및 IIMPLICIT_TRANSACTIONS가 ON으로 설정되어 암시적으로 시작된 트랜잭션을 보여 줍니다. 이 예에서는 열려 있는 트랜잭션과 닫혀 있는 트랜잭션을 보여 주기 위해 @@TRANCOUNT 함수를 사용합니다.
USE AdventureWorks;
GO
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 tran.
COMMIT TRANSACTION;
GO
참고 항목