Bagikan melalui


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.

Konvensi sintaks transact-SQL

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