Bagikan melalui


MULAI TRANSAKSI (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Gudang di Microsoft FabricDatabase SQL 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

Syntax

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

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

Sintaks untuk Fabric Data Warehouse, Azure Synapse Analytics, dan Analytics Platform System (PDW).

BEGIN { 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.

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 BEGIN...COMMIT atau BEGIN...ROLLBACK pernyataan terluar. transaction_name selalu peka huruf besar/kecil, bahkan ketika instans Mesin Database tidak peka huruf besar/kecil.

@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 MARK [ 'deskripsi' ]

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.

Menentukan bahwa transaksi ditandai dalam log transaksi. 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 pemulihan log transaksi ke titik yang diidentifikasi oleh tanda.

Remarks

BEGIN TRANSACTION kenaikan @@TRANCOUNT menurut 1.

BEGIN TRANSACTION mewakili titik di mana data yang dirujuk oleh sesi memiliki status konsistensi tertentu. Semua modifikasi data yang dilakukan setelah BEGIN TRANSACTION dapat digulung balik untuk mengembalikan data ke status konsistensi yang diketahui ini. Setiap transaksi berlangsung hingga COMMIT TRANSACTION dikeluarkan untuk menjadikan modifikasi sebagai bagian permanen dari database, atau semua modifikasi dihapus dengan ROLLBACK TRANSACTION pernyataan.

Transaksi dapat digulung balik secara otomatis jika terjadi kesalahan pembatalan transaksi, atau jika terjadi kesalahan run-time dan XACT_ABORT opsi sesi diatur ke ON. Untuk informasi selengkapnya, lihat MENGATUR XACT_ABORT.

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

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 . Setelah transaksi dimulai, Mesin Database dapat melakukan tindakan seperti memperoleh kunci untuk melindungi tingkat SELECT pernyataan isolasi transaksi, tetapi tidak ada yang dicatat dalam log transaksi sampai aplikasi melakukan tindakan modifikasi.

Setelah menerbitkan BEGIN TRANSACTION, Anda dapat mengeluarkan BEGIN TRANSACTION lagi untuk memulai satu atau beberapa transaksi dalam. Meskipun Anda dapat menentukan transaction_name untuk transaksi dalam, hanya nama transaksi pertama (terluar) yang terdaftar di sistem. Pembatalan ke nama lain (selain nama titik simpan yang valid) menghasilkan kesalahan tanpa mengembalikan pernyataan apa pun. Pernyataan digulung balik hanya ketika transaksi luar digulung balik.

Transaksi lokal yang BEGIN TRANSACTION dimulai oleh pernyataan dipromosikan 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.

Instans Mesin Database lokal 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 transaksi luar dan dalam, diatur @@TRANCOUNT ke 2. Untuk informasi selengkapnya, lihat SET IMPLICIT_TRANSACTIONS.

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.

Transaksi yang ditandai

Opsi WITH MARK ini menyebabkan nama transaksi dicatat dalam log transaksi. Saat Anda memulihkan database ke status sebelumnya, transaksi yang ditandai dapat digunakan untuk menentukan titik pemulihan alih-alih 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 konsistensi bersama tertentu. Aplikasi yang mengetahui status konsistensi setiap database dapat menempatkan tanda dalam log transaksi database terkait menggunakan lintas database atau transaksi terdistribusi. Memulihkan kumpulan database terkait ke tanda-tanda ini menghasilkan sekumpulan database yang memiliki status konsistensi bersama yang diketahui.

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

BEGIN TRANSACTION <new_name> WITH MARK dapat digunakan saat memulai transaksi dalam. Dalam hal ini, <new_name> menjadi nama tanda untuk transaksi jika transaksi luar tidak ditandai. Dalam contoh konseptual berikut, M2 adalah nama tanda.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;

UPDATE table2 ...;

SELECT column1 FROM table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

Saat menandai transaksi dalam, 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.

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

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, Azure Synapse Analytics, Analytics Platform System (PDW)

BEGIN TRANSACTION;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION;

B. Membatalkan transaksi

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, 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, database SQL di Microsoft Fabric

Contoh berikut menunjukkan cara memberi nama transaksi.

DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;

D. Menandai transaksi

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

Contoh berikut menunjukkan cara menandai transaksi. Transaksi CandidateDelete ditandai.

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION CandidateDelete;