SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse di Microsoft Fabric

Mengatur mode BEGIN TRANSACTION menjadi implisit, untuk koneksi.

Konvensi sintaks transact-SQL

Sintaksis

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Keterangan

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

ALTER TABLE

FETCH

REVOKE

BEGIN TRANSACTION

GRANT

SELECT (Lihat pengecualian di bawah ini.)

CREATE

INSERT

POTONG TABEL

DELETE

GABUNG

UPDATE

DROP

BUKA

 

Saat NONAKTIF, setiap pernyataan T-SQL sebelumnya dibatasi oleh BEGIN TRANSACTION yang tidak jelas dan pernyataan COMMIT TRANSACTION yang tidak jelas. Saat NONAKTIF, kami mengatakan mode transaksi adalah autocommit. Jika kode T-SQL Anda terlihat mengeluarkan BEGIN TRANSACTION, kami mengatakan mode transaksi bersifat eksplisit.

Ada beberapa poin klarifikasi untuk dipahami:

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

  • Ketika pernyataan INSERT Anda dan hal lain di unit kerja Anda selesai, Anda harus mengeluarkan pernyataan COMMIT TRANSACTION sampai @@TRANCOUNT diturunkan kembali ke 0. Atau Anda dapat mengeluarkan satu TRANSAKSI ROLLBACK.

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

  • Transaksi implisit mungkin tiba-tiba AKTIF karena default ANSI. Untuk detailnya, lihat SET ANSI_DEFAULTS (Transact-SQL).

    IMPLICIT_TRANSACTIONS AKTIF tidak populer. Dalam kebanyakan kasus di mana IMPLICIT_TRANSACTIONS AKTIF, itu karena pilihan SET ANSI_DEFAULTS ON telah dibuat.

  • Penyedia SQL Server Native Client OLE DB untuk SQL Server, dan driver ODBC SQL Server Native Client, secara otomatis mengatur IMPLICIT_TRANSACTIONS ke NONAKTIF saat menyambungkan. ATUR IMPLICIT_TRANSACTIONS default ke NONAKTIF untuk koneksi dengan penyedia terkelola SQLClient, dan untuk permintaan SOAP yang diterima melalui titik akhir HTTP.

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

DECLARE @IMPLICIT_TRANSACTIONS 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.

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

Selanjutnya adalah output teks dari skrip Transact-SQL sebelumnya.

-- Text output from 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  

Berikut adalah hasil yang ditetapkan.

Lihat Juga

ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
BUAT TABEL (Transact-SQL)
DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
FETCH (Transact-SQL)
GRANT (T-SQL)
INSERT (Transact-SQL)
MERGE (Transact-SQL)OPEN (Transact-SQL)
MENCABUT (Transact-SQL)
SELECT (Transact-SQL)
Pernyataan SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (T-SQL)
POTONG TABEL (Transact-SQL)
UPDATE (Transact-SQL)