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
.
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 INSERT
pernyataan , , UPDATE
atau 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
, atauUPDATE
yang mereferensikan tabel jarak jauh pada server tertaut dijalankan. PernyataanINSERT
, ,UPDATE
atauDELETE
gagal jika penyedia OLE DB yang digunakan untuk mengakses server tertaut tidak mendukungITransactionJoin
antarmuka.Panggilan dilakukan ke prosedur tersimpan
REMOTE_PROC_TRANSACTIONS
jarak jauh saat opsi diatur keON
.
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