Pekerjaan yang dilakukan oleh SP2 dimungkinkan untuk digulung kembali dan tidak terlepas dari pekerjaan yang dilakukan oleh SP1. Tetapi agar ini terjadi, Anda harus menulis prosedur tersimpan Anda menggunakan pola yang sangat spesifik, seperti yang dijelaskan dalam Penanganan pengecualian dan transaksi bertingkat :
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
end catch
end
Tidak semua kesalahan dapat dipulihkan, ada sejumlah kondisi kesalahan yang tidak dapat dipulihkan oleh transaksi, contoh yang paling jelas adalah kebuntuan (Anda akan diberitahu tentang pengecualian kebuntuan setelah transaksi telah dibatalkan). Baik SP1 dan [email protected]
harus ditulis menggunakan pola ini. Jika Anda memiliki SP nakal, atau Anda ingin memanfaatkan prosedur tersimpan yang ada yang mau tidak mau mengeluarkan ROLLBACK
pernyataan maka tujuan Anda hilang.