TRANSAKSI ROLLBACK (Transact-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse di Microsoft Fabric
Pernyataan ini mengembalikan transaksi eksplisit atau implisit ke awal transaksi, atau ke titik penyimpanan di dalam transaksi. Anda dapat menggunakan ROLLBACK TRANSACTION
untuk menghapus semua modifikasi data yang dilakukan dari awal transaksi atau ke titik penyimpanan. Ini juga membebaskan sumber daya yang dipegang oleh transaksi.
Menggulung balik transaksi tidak menyertakan perubahan yang dilakukan pada variabel lokal atau variabel tabel. Perubahan ini tidak dihapus oleh pernyataan ini.
Sintaks
Sintaks untuk SQL Server dan Azure SQL Database.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Sintaks untuk Gudang Data Synapse di Microsoft Fabric, Azure Synapse Analytics, dan Database Gudang Data Paralel.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Argumen
transaction_name
Nama yang ditetapkan ke transaksi pada BEGIN TRANSACTION
. transaction_name harus sesuai dengan aturan untuk pengidentifikasi, tetapi hanya 32 karakter pertama dari nama transaksi yang digunakan. Saat Anda menumpuk transaksi, transaction_name harus berupa nama dari pernyataan terluar BEGIN TRANSACTION
. transaction_name selalu peka huruf besar/kecil, bahkan ketika instans SQL Server tidak peka huruf besar/kecil.
@tran_name_variable
Nama variabel yang ditentukan pengguna yang berisi nama transaksi yang valid. Variabel harus dideklarasikan dengan jenis data char, varchar, nchar, atau nvarchar .
savepoint_name
savepoint_name dari pernyataanSAVE TRANSACTION
. savepoint_name harus sesuai dengan aturan untuk pengidentifikasi. Gunakan savepoint_name ketika pembatalan bersyarkala hanya akan memengaruhi bagian dari transaksi.
@savepoint_variable
Nama variabel yang ditentukan pengguna yang berisi nama titik simpan yang valid. Variabel harus dideklarasikan dengan jenis data char, varchar, nchar, atau nvarchar .
Penanganan kesalahan
Pernyataan ROLLBACK TRANSACTION
tidak menghasilkan pesan apa pun kepada pengguna. Jika peringatan diperlukan dalam prosedur atau pemicu tersimpan, gunakan RAISERROR
pernyataan atau PRINT
. RAISERROR
adalah pernyataan yang disukai untuk menunjukkan kesalahan.
Keterangan
ROLLBACK TRANSACTION
tanpa savepoint_name atau transaction_name kembali ke awal transaksi. Saat Anda menumpuk transaksi, pernyataan yang sama ini mengembalikan semua transaksi dalam ke pernyataan terluar BEGIN TRANSACTION
. Dalam kedua kasus, ROLLBACK TRANSACTION
mengurangi @@TRANCOUNT
fungsi sistem menjadi 0. ROLLBACK TRANSACTION <savepoint_name>
tidak mengurangi @@TRANCOUNT
.
ROLLBACK TRANSACTION
tidak dapat mereferensikan savepoint_name dalam transaksi terdistribusi yang dimulai secara eksplisit dengan BEGIN DISTRIBUTED TRANSACTION
atau diekskalasi dari transaksi lokal.
Transaksi tidak dapat digulung balik setelah COMMIT TRANSACTION
pernyataan dijalankan, kecuali ketika COMMIT TRANSACTION
dikaitkan dengan transaksi berlapis yang terkandung dalam transaksi yang digulung balik. Dalam hal ini, transaksi berlapis digulung balik, bahkan jika Anda mengeluarkan COMMIT TRANSACTION
untuk itu.
Dalam transaksi, nama titik penyimpanan duplikat diizinkan, tetapi ROLLBACK TRANSACTION
menggunakan nama titik simpan duplikat hanya kembali ke yang terbaru SAVE TRANSACTION
menggunakan nama titik simpan tersebut.
Interoperabilitas
Dalam prosedur tersimpan, ROLLBACK TRANSACTION
pernyataan tanpa savepoint_name atau transaction_name mengembalikan semua pernyataan ke terluar BEGIN TRANSACTION
. Pernyataan ROLLBACK TRANSACTION
dalam prosedur tersimpan @@TRANCOUNT
yang menyebabkan memiliki nilai yang berbeda ketika prosedur tersimpan selesai daripada @@TRANCOUNT
nilai ketika prosedur tersimpan disebut menghasilkan pesan informasi. Pesan ini tidak memengaruhi pemrosesan berikutnya.
ROLLBACK TRANSACTION
Jika dikeluarkan dalam pemicu:
Semua modifikasi data yang dilakukan pada titik tersebut dalam transaksi saat ini digulung balik, termasuk yang dibuat oleh pemicu.
Pemicu terus menjalankan pernyataan yang tersisa setelah
ROLLBACK
pernyataan. Jika salah satu pernyataan ini memodifikasi data, modifikasi tidak digulung balik. Tidak ada pemicu berlapis yang diaktifkan oleh eksekusi pernyataan yang tersisa ini.Pernyataan dalam batch setelah pernyataan yang menembakkan pemicu tidak dijalankan.
@@TRANCOUNT
ditahapkan oleh pemicu saat memasukkan pemicu, bahkan ketika dalam mode autocommit. (Sistem memperlakukan pemicu sebagai transaksi berlapis tersirat.)
ROLLBACK TRANSACTION
pernyataan dalam prosedur tersimpan tidak memengaruhi pernyataan berikutnya dalam batch yang disebut prosedur; pernyataan berikutnya dalam batch dijalankan. ROLLBACK TRANSACTION
pernyataan dalam pemicu mengakhiri batch yang berisi pernyataan yang menembakkan pemicu; pernyataan berikutnya dalam batch tidak dijalankan.
Efek ROLLBACK
pada kursor didefinisikan oleh tiga aturan ini:
Dengan
CURSOR_CLOSE_ON_COMMIT
setON
,ROLLBACK
tutup, tetapi tidak membatalkan alokasi semua kursor terbuka.Dengan
CURSOR_CLOSE_ON_COMMIT
setOFF
,ROLLBACK
tidak memengaruhi kursor atauSTATIC
INSENSITIVE
kursor atau asinkronSTATIC
terbuka yang sepenuhnya diisi. Kursor terbuka dari jenis lain ditutup tetapi tidak dibatalkan alokasinya.Kesalahan yang mengakhiri batch dan menghasilkan pembatalan internal membatalkan semua kursor yang dideklarasikan dalam batch yang berisi pernyataan kesalahan. Semua kursor dibatalkan alokasinya terlepas dari jenisnya atau pengaturan
CURSOR_CLOSE_ON_COMMIT
. Ini termasuk kursor yang dideklarasikan dalam prosedur tersimpan yang dipanggil oleh batch kesalahan. Kursor yang dideklarasikan dalam batch sebelum batch kesalahan tunduk pada dua aturan pertama. Kesalahan kebuntuan adalah contoh jenis kesalahan ini. PernyataanROLLBACK
yang dikeluarkan dalam pemicu juga secara otomatis menghasilkan jenis kesalahan ini.
Perilaku penguncian
Pernyataan ROLLBACK TRANSACTION
yang menentukan savepoint_name merilis kunci apa pun yang diperoleh di luar titik penyimpanan, kecuali untuk eskalasi dan konversi. Kunci ini tidak dilepaskan, dan tidak dikonversi kembali ke mode kunci sebelumnya.
Izin
Memerlukan keanggotaan dalam peran publik .
Contoh
Contoh berikut menunjukkan efek mengembalikan transaksi bernama. Setelah Anda membuat tabel, pernyataan berikut memulai transaksi bernama, menyisipkan dua baris, lalu mengembalikan transaksi bernama dalam variabel @TransactionName
. Pernyataan lain di luar transaksi bernama menyisipkan dua baris. Kueri mengembalikan hasil pernyataan sebelumnya.
USE tempdb;
GO
CREATE TABLE ValueTable ([value] INT);
GO
DECLARE @TransactionName VARCHAR(20) = 'Transaction1';
BEGIN TRANSACTION @TransactionName
INSERT INTO ValueTable
VALUES (1), (2);
ROLLBACK TRANSACTION @TransactionName;
INSERT INTO ValueTable
VALUES (3), (4);
SELECT [value]
FROM ValueTable;
DROP TABLE ValueTable;
Berikut set hasilnya.
value
-----
3
4