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.
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)
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk