적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
분석 플랫폼 시스템(PDW)
Microsoft Fabric
의 웨어하우스Microsoft Fabric의 SQL 데이터베이스
연결의 모드를 암시적으로 설정 BEGIN TRANSACTION 합니다.
구문
SET IMPLICIT_TRANSACTIONS { ON | OFF }
설명
이 때 ON, 시스템은 암묵적 거래 모드에 있습니다. 즉, 만약 @@TRANCOUNT = 0, 이면, 다음 Transact-SQL 문장 중 어느 하나가 새로운 거래를 시작한다는 뜻입니다. 이는 보이 BEGIN TRANSACTION 지 않는 자가 먼저 처형되는 것과 같습니다:
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT( 명확히 설명하는 참고) TRUNCATE TABLEUPDATE
이때 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';거래를 요구하지 않는 경우.암묵적 거래는 예상치 못하게
ONANSI 디폴트 때문일 수 있습니다. 자세한 내용은 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
관련 콘텐츠
- ALTER TABLE(Transact-SQL)
- BEGIN TRANSACTION(Transact-SQL)
- CREATE TABLE(Transact-SQL)
- 삭제 (Transact-SQL)
- DROP TABLE(Transact-SQL)
- FETCH(Transact-SQL)
- GRANT(Transact-SQL)
- INSERT(Transact-SQL)
- MERGE(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)