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