Bagikan melalui


TRANSAKSI PENERAPAN (T-SQL)

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

Menandai akhir transaksi implisit atau eksplisit yang berhasil.

Jika @@TRANCOUNT adalah 1, COMMIT TRANSACTION buat semua modifikasi data sejak awal transaksi menjadi bagian permanen dari database, membebaskan sumber daya transaksi, dan penurunan @@TRANCOUNT ke 0.

Ketika @@TRANCOUNT lebih besar dari 1, COMMIT TRANSACTION penurunan @@TRANCOUNT sebesar 1 dan transaksi tetap aktif.

Konvensi sintaks transact-SQL

Syntax

Sintaks untuk SQL Server, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric.

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Sintaks untuk Fabric Data Warehouse, Azure Synapse Analytics, dan Parallel Data Warehouse Database.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Berlaku untuk: SQL Server 2008 (10.0.x) dan versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric.

Diabaikan oleh Mesin Database saat ditentukan dengan COMMIT. transaction_name menentukan nama transaksi yang ditetapkan oleh sebelumnyaBEGIN TRANSACTION. transaction_name harus sesuai dengan aturan untuk pengidentifikasi, tetapi tidak boleh melebihi 32 karakter. transaction_name dapat digunakan sebagai teknik dokumentasi kode untuk menunjukkan pernyataan COMMIT TRANSACTION bagian dalam BEGIN TRANSACTION mana yang dikaitkan dengan pernyataan tersebut.

@tran_name_variable

Berlaku untuk: SQL Server 2008 (10.0.x) dan versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric.

Nama variabel yang ditentukan pengguna yang berisi nama transaksi yang valid. Variabel harus dideklarasikan dengan jenis data char, varchar, nchar, atau nvarchar . Jika lebih dari 32 karakter diteruskan ke variabel, hanya 32 karakter pertama yang digunakan. Karakter yang tersisa dipotong.

DENGAN DELAYED_DURABILITY = { OFF | AKTIF }

Berlaku untuk: SQL Server 2008 (10.0.x) dan versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric.

Opsi yang meminta transaksi ini diterapkan dengan durabilitas tertunda. Permintaan diabaikan jika durabilitas tertunda dinonaktifkan untuk database. Transaksi dilakukan dengan durabilitas tertunda terlepas dari opsi ini jika durabilitas yang tertunda dipaksa untuk database.

Untuk informasi selengkapnya, lihat Mengontrol Durabilitas Transaksi.

Remarks

Aplikasi bertanggung jawab untuk mengeluarkan COMMIT TRANSACTION pada titik ketika semua data yang dirujuk oleh transaksi mencapai status konsistensi yang dimaksudkan.

Jika transaksi yang dilakukan adalah transaksi terdistribusi Transact-SQL, COMMIT TRANSACTION memicu MS DTC untuk menggunakan protokol penerapan dua fase untuk melakukan transaksi pada semua server yang terlibat dalam transaksi. Saat transaksi lokal mencakup dua database atau lebih pada instans Mesin Database yang sama, instans menggunakan penerapan dua fase internal untuk melakukan transaksi di semua database yang terlibat dalam transaksi.

Saat digunakan untuk transaksi dalam, penerapan tidak membebaskan sumber daya atau membuat modifikasi data menjadi permanen. Modifikasi data dilakukan secara permanen dan sumber daya dibeberkan hanya ketika transaksi luar dilakukan. Masing-masing COMMIT TRANSACTION dikeluarkan ketika @@TRANCOUNT lebih besar dari 1 dekremen @@TRANCOUNT oleh 1 tetapi tidak memiliki efek lain. Ketika @@TRANCOUNT akhirnya ditunda menjadi 0, seluruh transaksi luar dilakukan. Karena transaction_name yang ditentukan dengan COMMIT TRANSACTION diabaikan oleh Mesin Database, mengeluarkan COMMIT TRANSACTION referensi nama transaksi luar ketika ada transaksi dalam yang terutang hanya penurunan @@TRANCOUNT sebesar 1.

Mengeluarkan COMMIT TRANSACTION ketika @@TRANCOUNT nol menghasilkan kesalahan karena tidak ada yang sesuai BEGIN TRANSACTION.

Anda tidak dapat mengembalikan transaksi setelah COMMIT TRANSACTION pernyataan dikeluarkan, karena modifikasi data sudah menjadi bagian permanen dari database.

Nota

Mesin Database tidak mendukung transaksi berlapis yang dapat dikelola secara independen. Penerapan penurunan @@TRANCOUNT transaksi dalam tetapi tidak memiliki efek lain. Pemutaran kembali transaksi dalam selalu mengembalikan transaksi luar, kecuali ada titik penyimpanan dan ditentukan dalam ROLLBACK pernyataan.

Permissions

Memerlukan keanggotaan dalam peran tersebut public .

Examples

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

A. Menerapkan transaksi

Berlaku untuk: SQL Server, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)

Contoh berikut menghapus kandidat pekerjaan.

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;

B. Melakukan transaksi luar dan transaksi dalam

Berlaku untuk: SQL Server, Azure SQL Database, Azure SQL Managed Instance, database SQL di Microsoft Fabric.

Contoh berikut membuat tabel, memulai transaksi luar dan dua dalam, lalu menerapkan setiap transaksi. Parameter transaction_name yang digunakan dalam contoh ini membantu pengembang memastikan bahwa jumlah penerapan yang benar dikodekan ke penurunan @@TRANCOUNT ke 0 dan untuk melakukan transaksi luar.

IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
    DROP TABLE TestTran;
GO

CREATE TABLE TestTran (
    Cola INT PRIMARY KEY,
    Colb CHAR(3)
);
GO

-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;

PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (1, 'aaa');

-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;

PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (2, 'bbb');

-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;

PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (3, 'ccc');

-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;

PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;

PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;

PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));