Bagikan melalui


BEGIN TRANSACTION (Transact-SQL)

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

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

Konvensi sintaks transact-SQL

Sintaks

Sintaks untuk SQL Server, Azure SQL Database, dan Azure SQL Managed Instance.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Sintaks untuk Gudang Data Synapse di Microsoft Fabric, Azure Synapse Analytics, dan Analytics Platform System (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Argumen

transaction_name

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

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...ROLLBACK pernyataan. 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 versi yang lebih baru, Azure SQL Database, dan Azure SQL Managed Instance

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.

WITH MARK [ 'description' ]

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

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 msdb.dbo.logmarkhistory tabel.

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

Keterangan

BEGIN TRANSACTION kenaikan @@TRANCOUNT menurut 1.

BEGIN TRANSACTION mewakili titik di mana data yang dirujuk 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 sebagai bagian permanen dari database, atau kesalahan ditemui dan semua modifikasi dihapus dengan ROLLBACK TRANSACTION pernyataan.

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 sampai selesai dengan COMMIT TRANSACTION pernyataan atau ROLLBACK TRANSACTION . 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, transaksi tidak dicatat dalam log transaksi sampai aplikasi kemudian melakukan tindakan yang harus dicatat dalam log, seperti menjalankan INSERTpernyataan , , UPDATEatau DELETE . Aplikasi dapat melakukan tindakan seperti memperoleh kunci untuk melindungi tingkat SELECT isolasi transaksi pernyataan, 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 BEGIN TRANSACTION dimulai oleh pernyataan 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, , UPDATEatau DELETE gagal jika penyedia OLE DB yang digunakan untuk mengakses server tertaut tidak mendukung ITransactionJoin antarmuka.

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

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.

Ketika SET IMPLICIT_TRANSACTIONS diatur ke ON, BEGIN TRANSACTION pernyataan membuat dua transaksi berlapis. Untuk informasi selengkapnya, lihat SET IMPLICIT_TRANSACTIONS.

Transaksi yang ditandai

Opsi WITH MARK ini menyebabkan nama transaksi ditempatkan dalam log transaksi. Saat Anda memulihkan database ke status sebelumnya, transaksi yang ditandai dapat digunakan sebagai pengganti tanggal dan waktu. Untuk informasi selengkapnya, lihat Menggunakan Transaksi Bertanda untuk Memulihkan Database Terkait Secara Konsisten dan Pernyataan RESTORE.

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 TRANSACTION <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 Anda menumpuk transaksi, Anda menerima pesan peringatan berikut jika Anda mencoba menandai transaksi yang sudah ditandai:

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

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. Menggunakan transaksi eksplisit

Berlaku untuk: SQL Server 2008 (10.0.x) dan versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

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

B. Mengembalikan transaksi

Berlaku untuk: SQL Server 2008 (10.0.x) dan versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)

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

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

C. Beri nama transaksi

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

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 versi yang lebih baru, Azure SQL Database, Azure SQL Managed Instance

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