SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Berlaku untuk: SQL Server (semua versi yang didukung) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Mengatur mode BEGIN TRANSACTION menjadi implisit, untuk koneksi.

tautan topikIkon Konvensi Sintaks Transact-SQL

Sintaks

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

Catatan

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

Keterangan

Ketika ON, 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

MERGE

UPDATE

DROP

BUKA

 

Saat NONAKTIF, masing-masing pernyataan T-SQL sebelumnya dibatasi oleh BEGIN TRANSACTION yang tidak nampak dan pernyataan COMMIT TRANSACTION yang tidak diketahui. 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 diketahui yang dikeluarkan jika sudah @@trancount > 0. Namun, setiap pernyataan BEGIN TRANSACTION eksplisit masih mengalami peningkatan @@TRANCOUNT.

  • Ketika pernyataan INSERT Anda dan apa pun 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 MENGATUR 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 INSERTs, == 1  
[D.05] @@TranCount, after INSERTs, == 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 (Transact-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)
TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)