আপনার যদি ট্রাই / ক্যাচ ব্লক থাকে তবে সম্ভাব্য কারণটি হ'ল আপনি কোনও লেনদেন বাতিল বিসর্জন ব্যতিক্রম ধরছেন এবং চালিয়ে যান। ক্যাচ ব্লকে আপনাকে অবশ্যই সর্বদা পরীক্ষা করা উচিত XACT_STATE()
এবং যথাযথ বাতিল হওয়া এবং আপত্তিজনক (ডুমডড) লেনদেন পরিচালনা করতে হবে। যদি আপনার কলার কোনও লেনদেন শুরু করে এবং কালী আঘাত করে, বলুন, একটি অচলাবস্থা (যা লেনদেনটি বাতিল করে দিয়েছিল), কলি কীভাবে কলকারীর সাথে যোগাযোগ করতে চলেছে যে লেনদেনটি বাতিল ছিল এবং এটি 'যথারীতি ব্যবসা'তে চালিয়ে যাওয়া উচিত নয়? একমাত্র সম্ভাব্য উপায় হ'ল একজন ব্যতিক্রমকে নতুন করে উত্থাপন করা, কলারকে পরিস্থিতি সামাল দিতে বাধ্য করে। যদি আপনি নিঃশব্দে কোনও বাতিল হওয়া লেনদেন গ্রাস করেন এবং কলকারী ধরেই নিচ্ছেন যে মূল লেনদেনে এখনও রয়েছে তবে কেবল মারামারিই নিশ্চিত করতে পারে (এবং যে ত্রুটি আপনি পেয়েছেন সেটি ইঞ্জিন নিজেকে রক্ষার চেষ্টা করার উপায়)।
আমি আপনাকে ব্যতিক্রম হ্যান্ডলিং এবং নেস্টেড লেনদেনগুলি ছাড়িয়ে যাওয়ার পরামর্শ দিচ্ছি যা এমন প্যাটার্ন দেখায় যা নেস্টেড লেনদেন এবং ব্যতিক্রমগুলির সাথে ব্যবহার করা যেতে পারে:
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