BEGIN TRANSACTION (Transact-SQL)

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

Menandai titik awal transaksi lokal eksplisit. Transaksi eksplisit dimulai dengan pernyataan BEGIN TRANSACTION dan diakhiri dengan pernyataan COMMIT atau ROLLBACK.

Konvensi sintaks transact-SQL

Sintaksis

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

Catatan

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

Argumen

transaction_name
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database

Adalah nama yang ditetapkan ke transaksi. transaction_name harus sesuai dengan aturan untuk pengidentifikasi, tetapi pengidentifikasi yang lebih panjang dari 32 karakter tidak diizinkan. Gunakan nama transaksi hanya pada pasangan terluar berlapis BEGIN... COMMIT atau BEGIN... Pernyataan ROLLBACK. transaction_name selalu peka huruf besar/kecil, bahkan ketika instans SQL Server tidak peka huruf besar/kecil.

@tran_name_variable
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database

Adalah 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 akan digunakan; karakter yang tersisa akan dipotong.

WITH MARK [ 'description' ]
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database

Menentukan bahwa transaksi ditandai dalam log. deskripsi adalah string yang menjelaskan tanda. Deskripsi yang lebih panjang dari 128 karakter dipotong menjadi 128 karakter sebelum disimpan dalam tabel msdb.dbo.logmarkhistory.

Jika WITH MARK digunakan, nama transaksi harus ditentukan. WITH MARK memungkinkan pemulihan log transaksi ke tanda bernama.

Keterangan Umum

MULAI kenaikan TRANSAKSI @@TRANCOUNT sebesar 1.

BEGIN TRANSACTION menunjukkan titik di mana data yang direferensikan oleh koneksi secara logis dan konsisten secara fisik. Jika terjadi kesalahan, semua modifikasi data yang dilakukan setelah BEGIN TRANSACTION dapat digulung balik untuk mengembalikan data ke status konsistensi yang diketahui ini. Setiap transaksi berlangsung hingga selesai tanpa kesalahan dan COMMIT TRANSACTION dikeluarkan untuk menjadikan modifikasi bagian permanen dari database, atau kesalahan ditemui dan semua modifikasi dihapus dengan pernyataan TRANSAKSI ROLLBACK.

BEGIN TRANSACTION memulai transaksi lokal untuk koneksi yang mengeluarkan pernyataan. Tergantung pada pengaturan tingkat isolasi transaksi saat ini, banyak sumber daya yang diperoleh untuk mendukung pernyataan Transact-SQL yang dikeluarkan oleh koneksi dikunci oleh transaksi hingga selesai dengan pernyataan TRANSAKSI COMMIT TRANSACTION atau ROLLBACK. Transaksi yang tertinggal untuk jangka waktu yang lama dapat mencegah pengguna lain mengakses sumber daya terkunci ini, dan juga dapat mencegah pemotongan log.

Meskipun BEGIN TRANSACTION memulai transaksi lokal, ini tidak dicatat dalam log transaksi sampai aplikasi kemudian melakukan tindakan yang harus dicatat dalam log, seperti menjalankan pernyataan INSERT, UPDATE, atau DELETE. Aplikasi dapat melakukan tindakan seperti memperoleh kunci untuk melindungi tingkat isolasi transaksi pernyataan SELECT, tetapi tidak ada yang dicatat dalam log sampai aplikasi melakukan tindakan modifikasi.

Penamaan beberapa transaksi dalam serangkaian transaksi berlapis dengan nama transaksi memiliki sedikit efek pada transaksi. Hanya nama transaksi pertama (terluar) yang terdaftar di sistem. Pembatalan ke nama lain (selain nama titik simpan yang valid) menghasilkan kesalahan. Tidak ada pernyataan yang dijalankan sebelum pemutaran kembali, pada kenyataannya, digulung balik pada saat kesalahan ini terjadi. Pernyataan digulung balik hanya ketika transaksi luar digulung balik.

Transaksi lokal yang dimulai oleh pernyataan BEGIN TRANSACTION dieskalasikan ke transaksi terdistribusi jika tindakan berikut dilakukan sebelum pernyataan diterapkan atau digulung balik:

  • Pernyataan INSERT, DELETE, atau UPDATE yang mereferensikan tabel jarak jauh pada server tertaut dijalankan. Pernyataan INSERT, UPDATE, atau DELETE gagal jika penyedia OLE DB yang digunakan untuk mengakses server tertaut tidak mendukung antarmuka ITransactionJoin.

  • Panggilan dilakukan ke prosedur tersimpan jarak jauh saat opsi REMOTE_PROC_TRANSACTIONS diatur ke AKTIF.

Salinan lokal SQL Server menjadi pengontrol transaksi dan menggunakan Koordinator Transaksi Terdistribusi Microsoft (MS DTC) untuk mengelola transaksi terdistribusi.

Transaksi dapat dijalankan secara eksplisit sebagai transaksi terdistribusi dengan menggunakan BEGIN DISTRIBUTED TRANSACTION. Untuk informasi selengkapnya, lihat MULAI TRANSAKSI TERDISTRIBUSI (Transact-SQL).

Saat SET IMPLICIT_TRANSACTIONS diatur ke AKTIF, pernyataan BEGIN TRANSACTION membuat dua transaksi berlapis. Untuk informasi selengkapnya lihat, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transaksi Yang Ditandai

Opsi WITH MARK menyebabkan nama transaksi ditempatkan dalam log transaksi. Saat memulihkan database ke status sebelumnya, transaksi yang ditandai dapat digunakan sebagai pengganti tanggal dan waktu. Untuk informasi selengkapnya, lihat Menggunakan Transaksi Yang Ditandai untuk Memulihkan Database Terkait Secara Konsisten (Model Pemulihan Penuh) dan PEMULIHAN (Transact-SQL).

Selain itu, tanda log transaksi diperlukan jika Anda perlu memulihkan sekumpulan database terkait ke status konsisten secara logis. Tanda dapat ditempatkan dalam log transaksi database terkait oleh transaksi terdistribusi. Memulihkan sekumpulan database terkait ke tanda-tanda ini menghasilkan sekumpulan database yang konsisten secara transaksional. Penempatan tanda dalam database terkait memerlukan prosedur khusus.

Tanda ditempatkan dalam log transaksi hanya jika database diperbarui oleh transaksi yang ditandai. Transaksi yang tidak mengubah data tidak ditandai.

BEGIN TRAN new_name WITH MARK dapat ditumpuk dalam transaksi yang sudah ada yang tidak ditandai. Setelah melakukannya, new_name menjadi nama tanda untuk transaksi, meskipun nama transaksi mungkin sudah diberikan. Dalam contoh berikut, M2 adalah nama tanda.

BEGIN TRAN T1;  
UPDATE table1 ...;  
BEGIN TRAN M2 WITH MARK;  
UPDATE table2 ...;  
SELECT * from table1;  
COMMIT TRAN M2;  
UPDATE table3 ...;  
COMMIT TRAN T1;  

Saat menumpuk transaksi, mencoba menandai transaksi yang sudah ditandai menghasilkan pesan peringatan (bukan kesalahan):

"MULAI TRAN T1 DENGAN TANDA ...;"

"PERBARUI tabel1 ...;"

"MULAI TRAN M2 DENGAN TANDA ...;"

"Server: Msg 3920, Tingkat 16, Status 1, Baris 3"

"Opsi WITH MARK hanya berlaku untuk BEGIN TRAN WITH MARK pertama."

"Opsi diabaikan."

Izin

Memerlukan keanggotaan dalam peran publik.

Contoh

J. Menggunakan transaksi eksplisit

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database, Azure Synapse Analytics, Gudang Data Paralel

Contoh ini menggunakan AdventureWorks.

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

B. Mengembalikan transaksi

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database , Azure Synapse Analytics, Gudang Data Paralel

Contoh berikut menunjukkan efek menggulung balik transaksi. Dalam contoh ini, pernyataan ROLLBACK akan mengembalikan pernyataan INSERT, tetapi tabel yang dibuat masih akan ada.

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

C. Penamaan transaksi

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database

Contoh berikut menunjukkan cara memberi nama transaksi.

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2022;  
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO  

D. Menandai transaksi

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru, Azure SQL Database

Contoh berikut menunjukkan cara menandai transaksi. Transaksi CandidateDelete ditandai.

BEGIN TRANSACTION CandidateDelete  
    WITH MARK N'Deleting a Job Candidate';  
GO  
USE AdventureWorks2022;  
GO  
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
GO  
COMMIT TRANSACTION CandidateDelete;  
GO  

Lihat Juga

MULAI TRANSAKSI TERDISTRIBUSI (T-SQL)
TRANSAKSI PENERAPAN (T-SQL)
COMMIT WORK (Transact-SQL)
TRANSAKSI ROLLBACK (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SIMPAN TRANSAKSI (T-SQL)