Bagikan melalui


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Gudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Mengatur BEGIN TRANSACTION mode ke implisit, untuk koneksi.

Konvensi sintaks transact-SQL

Sintaks

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Keterangan

Ketika ON, sistem dalam mode transaksi implisit. Artinya, jika @@TRANCOUNT = 0, salah satu pernyataan Transact-SQL berikut memulai transaksi baru. Ini setara dengan yang tidak terlihat BEGIN TRANSACTION dieksekusi terlebih dahulu:

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • MERGE
  • OPEN
  • REVOKE
  • SELECT (Lihat komentar klarifikasi)
  • TRUNCATE TABLE
  • UPDATE

Ketika OFF, masing-masing pernyataan T-SQL sebelumnya dibatasi oleh pernyataan yang tidak terlihat BEGIN TRANSACTION dan tidak terlihat COMMIT TRANSACTION . Ketika OFF, kami mengatakan mode transaksi adalah autocommit. Jika kode T-SQL Anda terlihat mengeluarkan , BEGIN TRANSACTIONkami mengatakan mode transaksi eksplisit.

Ada beberapa poin klarifikasi untuk dipahami:

  • Ketika mode transaksi implisit, tidak ada yang tidak terlihat BEGIN TRANSACTION yang dikeluarkan jika @@TRANCOUNT > 0 sudah. Namun, setiap pernyataan eksplisit BEGIN TRANSACTION masih bertambah @@TRANCOUNT.

  • Ketika pernyataan Anda INSERT dan apa pun dalam unit kerja Anda selesai, Anda harus mengeluarkan COMMIT TRANSACTION pernyataan sampai @@TRANCOUNT diturunkan kembali ke 0. Atau Anda dapat menerbitkannya ROLLBACK TRANSACTION.

  • SELECT pernyataan yang tidak dipilih dari tabel tidak memulai transaksi implisit. Misalnya, SELECT GETDATE(); atau SELECT 1, 'ABC'; tidak memerlukan transaksi.

  • Transaksi implisit mungkin secara tak terduga ON disebabkan oleh default ANSI. Untuk detailnya, lihat SET ANSI_DEFAULTS.

    Pengaturan IMPLICIT_TRANSACTIONS ke ON tidak populer. Dalam kebanyakan kasus di mana IMPLICIT_TRANSACTIONS , ONitu karena SET ANSI_DEFAULTS ON telah diatur.

  • Penyedia OLE DB Klien Asli SQL Server untuk SQL Server, dan driver ODBC Klien Asli SQL Server, secara otomatis diatur IMPLICIT_TRANSACTIONS ke OFF saat terhubung. Atur IMPLICIT_TRANSACTIONS default ke OFF untuk koneksi dengan penyedia terkelola SQLClient, dan untuk permintaan SOAP yang diterima melalui titik akhir HTTP.

Untuk melihat pengaturan saat ini untuk IMPLICIT_TRANSACTIONS, jalankan kueri berikut.

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

Contoh

Skrip Transact-SQL berikut menjalankan beberapa kasus pengujian yang berbeda. Output teks juga disediakan, yang menunjukkan perilaku terperinci dan hasil dari setiap kasus pengujian.

-- 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

Selanjutnya adalah output teks dari skrip Transact-SQL sebelumnya.

-------- [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