TRANSAKSI PENERAPAN (T-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse 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
hanya dengan 1 dan transaksi tetap aktif.
Sintaks
Sintaks untuk SQL Server dan Azure SQL Database.
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Sintaks untuk Gudang Data Synapse di Microsoft Fabric, Azure Synapse Analytics, dan Database Gudang Data Paralel.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
Argumen
transaction_name
Berlaku untuk: SQL Server dan Azure SQL Database
Diabaikan oleh Mesin Database SQL Server. 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 menunjukkan kepada pemrogram yang berlapis BEGIN TRANSACTION
COMMIT TRANSACTION
yang terkait dengannya.
@tran_name_variable
Berlaku untuk: SQL Server dan Azure SQL Database
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 yang digunakan. Karakter yang tersisa dipotong.
WITH DELAYED_DURABILITY = { OFF | ON }
Berlaku untuk: SQL Server dan Azure SQL Database
Opsi yang meminta transaksi ini harus dilakukan dengan durabilitas tertunda. Permintaan diabaikan jika database diubah dengan DELAYED_DURABILITY = DISABLED
atau DELAYED_DURABILITY = FORCED
. Untuk informasi selengkapnya, lihat Mengontrol Durabilitas Transaksi.
Keterangan
Ini adalah tanggung jawab pemrogram Transact-SQL untuk mengeluarkan COMMIT TRANSACTION
hanya pada titik ketika semua data yang direferensikan oleh transaksi secara logis benar.
Jika transaksi yang dilakukan adalah transaksi terdistribusi Transact-SQL, COMMIT TRANSACTION
memicu MS DTC untuk menggunakan protokol penerapan dua fase untuk menerapkan 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 menerapkan semua database yang terlibat dalam transaksi.
Saat digunakan dalam transaksi berlapis, penerapan transaksi dalam tidak membebaskan sumber daya atau membuat modifikasinya permanen. Modifikasi data dilakukan secara permanen dan sumber daya hanya dibeberkan ketika transaksi luar dilakukan. Masing-masing COMMIT TRANSACTION
dikeluarkan ketika @@TRANCOUNT
lebih besar dari satu keputusan @@TRANCOUNT
saja dengan 1. Ketika @@TRANCOUNT
akhirnya ditunda menjadi 0, seluruh transaksi luar dilakukan. Karena transaction_name diabaikan oleh Mesin Database, mengeluarkan COMMIT TRANSACTION
referensi nama transaksi luar ketika ada transaksi dalam yang terutang hanya keputusan @@TRANCOUNT
sebesar 1.
Mengeluarkan COMMIT TRANSACTION
ketika @@TRANCOUNT
nol menghasilkan kesalahan; tidak ada yang sesuai BEGIN TRANSACTION
.
Anda tidak dapat mengembalikan transaksi setelah COMMIT TRANSACTION
pernyataan dikeluarkan, karena modifikasi data dibuat sebagai bagian permanen dari database.
Mesin Database menaikkan jumlah transaksi dalam pernyataan hanya ketika jumlah transaksi adalah 0 di awal pernyataan.
Izin
Memerlukan keanggotaan dalam peran publik .
Contoh
Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022
database sampel atau AdventureWorksDW2022
, yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.
J. Menerapkan transaksi
Berlaku untuk: SQL Server, Azure SQL Database, Azure Synapse Analytics, dan Analytics Platform System (PDW)
Contoh berikut menghapus kandidat pekerjaan.
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Menerapkan transaksi berlapis
Berlaku untuk: SQL Server dan Azure SQL Database
Contoh berikut membuat tabel, menghasilkan tiga tingkat transaksi berlapis, lalu melakukan transaksi berlapis. Meskipun setiap COMMIT TRANSACTION
pernyataan memiliki parameter transaction_name , tidak ada hubungan antara COMMIT TRANSACTION
pernyataan dan BEGIN TRANSACTION
. Parameter transaction_name membantu programmer memastikan bahwa jumlah penerapan yang benar dikodekan ke @@TRANCOUNT
0 dan sebagainya 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));