Bir TRY / CATCH bloğunuz varsa, bunun olası nedeni, bir işlem iptal istisnasını yakalayıp devam etmenizdir. CATCH bloğunda her zaman XACT_STATE()
uygun iptal edilmiş ve teslim edilemeyen (mahkum edilmiş) işlemleri kontrol etmeli ve işlemelisiniz. Arayanınız bir işlem başlatırsa ve arayan kişi örneğin bir kilitlenme (işlemi iptal eden) ile karşılaşırsa, aranan uç, arayan kişiye işlemin iptal edildiğini ve 'her zamanki gibi çalışmaya devam etmemesi gerektiğini' nasıl bildirecek? Tek uygulanabilir yol, bir istisnayı yeniden gündeme getirerek arayan kişiyi durumu halletmeye zorlamaktır. Durdurulmuş bir işlemi sessizce yutarsanız ve arayan kişi hala orijinal işlemde olduğunu varsaymaya devam ederse, yalnızca kargaşa bunu sağlayabilir (ve aldığınız hata, motorun kendini korumaya çalışmasıdır).
İç içe geçmiş işlemler ve istisnalarla kullanılabilecek bir model gösteren İstisna işlemeyi ve iç içe geçmiş işlemleri gözden geçirmenizi öneririm :
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;
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
go