Bagikan melalui


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.

Konvensi sintaks transact-SQL

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 TRANSACTIONtanpa 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 set ON, ROLLBACK tutup, tetapi tidak membatalkan alokasi semua kursor terbuka.

  • Dengan CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK tidak memengaruhi kursor atau STATIC INSENSITIVE kursor atau asinkron STATIC 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. Pernyataan ROLLBACK 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