다음을 통해 공유


SET IMPLICIT_TRANSACTIONS(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics분석 플랫폼 시스템(PDW)Microsoft Fabric의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

연결의 모드를 암시적으로 설정 BEGIN TRANSACTION 합니다.

Transact-SQL 구문 표기 규칙

구문

SET IMPLICIT_TRANSACTIONS { ON | OFF }

설명

이 때 ON, 시스템은 암묵적 거래 모드에 있습니다. 즉, 만약 @@TRANCOUNT = 0, 이면, 다음 Transact-SQL 문장 중 어느 하나가 새로운 거래를 시작한다는 뜻입니다. 이는 보이 BEGIN TRANSACTION 지 않는 자가 먼저 처형되는 것과 같습니다:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT ( 명확히 설명하는 참고)
  • TRUNCATE TABLE
  • UPDATE

이때 OFF, 앞서 나오는 각 T-SQL 문은 보이 BEGIN TRANSACTION 지 않는 문과 보이 COMMIT TRANSACTION 지 않는 문으로 경계가 됩니다. 이 있을 때 OFF, 트랜잭션 모드는 자동 커밋이라고 합니다. 만약 T-SQL 코드가 눈에 띄게 , BEGIN TRANSACTION를 발행한다면, 트랜잭션 모드는 명시적이라고 합니다.

명확한 이해가 필요한 몇 가지는 다음과 같습니다.

  • 트랜잭션 모드가 암묵적일 때는 이미 보이지 BEGIN TRANSACTION 않는 상태가 발행 @@TRANCOUNT > 0 되지 않습니다. 하지만 명시적 BEGIN TRANSACTION 명제는 여전히 증가합니다 @@TRANCOUNT.

  • 명세서와 작업 단위의 모든 것이 끝나면 INSERT , 명세서를 발행 COMMIT TRANSACTION 해야 하며, 0으로 줄어들 때까지 @@TRANCOUNT 계속해야 합니다. 또는 직접 발급 ROLLBACK TRANSACTION할 수도 있습니다.

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

  • 암묵적 거래는 예상치 못하게 ON ANSI 디폴트 때문일 수 있습니다. 자세한 내용은 SET ANSI_DEFAULTS를 참조하세요.

    IMPLICIT_TRANSACTIONS 설정은 ON 인기가 없습니다. 대부분의 경우 IMPLICIT_TRANSACTIONSON, 이 설정되었기 때문입니다 SET ANSI_DEFAULTS ON .

  • SQL Server 네이티브 클라이언트 OLE DB 프로바이더와 SQL Server 네이티브 클라이언트 ODBC 드라이버는 연결 시 자동으로 로 OFF 설정 IMPLICIT_TRANSACTIONS 됩니다. SQLClient 관리 제공자와의 연결과 HTTP 엔드포인트를 통해 수신된 SOAP 요청에 대해 기본값을 로 OFF 설정하세요IMPLICIT_TRANSACTIONS.

의 현재 설정을 IMPLICIT_TRANSACTIONS보려면 다음 쿼리를 실행하세요.

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

예제

다음 Transact-SQL 스크립트는 몇 가지 다른 테스트 사례를 실행합니다. 각 테스트 사례의 세부 동작과 결과를 보여주는 텍스트 출력도 제공됩니다.

-- Preparations.
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a INT);
GO

PRINT N'-------- [Test A] ---- OFF ----';
PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';
PRINT N'[A.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS OFF;
GO
INSERT INTO dbo.t1 VALUES (11);
INSERT INTO dbo.t1 VALUES (12);
PRINT N'[A.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test B] ---- ON ----';
PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[B.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (21);
INSERT INTO dbo.t1 VALUES (22);
PRINT N'[B.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[B.04] @@TRANCOUNT, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';
PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[C.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (31);
INSERT INTO dbo.t1 VALUES (32);
PRINT N'[C.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[C.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[C.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';
PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[D.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (41);
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (42);
PRINT N'[D.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[D.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[D.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

-- Clean up.
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
DROP TABLE dbo.t1;
GO

다음은 이전 Transact-SQL 스크립트의 텍스트 출력입니다.

-------- [Test A] ---- OFF ----
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.
[A.02] @@TRANCOUNT, at start, == 0
[A.03] @@TRANCOUNT, after INSERTs, == 0

-------- [Test B] ---- ON ----
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[B.02] @@TRANCOUNT, at start, == 0
[B.03] @@TRANCOUNT, after INSERTs, == 1
[B.04] @@TRANCOUNT, after COMMIT, == 0

-------- [Test C] ---- ON, then BEGIN TRAN ----
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[C.02] @@TRANCOUNT, at start, == 0
[C.03] @@TRANCOUNT, after INSERTs, == 2
[C.04] @@TRANCOUNT, after a COMMIT, == 1
[C.05] @@TRANCOUNT, after another COMMIT, == 0

-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[D.02] @@TRANCOUNT, at start, == 0
[D.03] @@TRANCOUNT, after INSERTs, == 2
[D.04] @@TRANCOUNT, after a COMMIT, == 1
[D.05] @@TRANCOUNT, after another COMMIT, == 0