SET XACT_ABORT ONসঞ্চিত পদ্ধতিতে ব্যবহার করে কী লাভ ?
SET XACT_ABORT ONসঞ্চিত পদ্ধতিতে ব্যবহার করে কী লাভ ?
উত্তর:
SET XACT_ABORT ONএসকিউএল সার্ভারকে পুরো লেনদেনটি রোলব্যাক করতে এবং রান-টাইম ত্রুটি দেখা দিলে ব্যাচটি বাতিল করতে নির্দেশ দেয়। এটি আপনাকে এসকিউএল সার্ভারের মধ্যে না হয়ে ক্লায়েন্ট অ্যাপ্লিকেশনটিতে কমান্ড টাইমআউট হওয়ার মতো ক্ষেত্রে (যা ডিফল্ট XACT_ABORT OFFসেটিংসের আওতায় আসে না isn't
যেহেতু কোনও ক্যোয়ারির সময়সীমা লেনদেনটি উন্মুক্ত ছেড়ে দেবে, SET XACT_ABORT ONসমস্ত স্পষ্ট পদ্ধতিতে সুস্পষ্ট লেনদেনের সাথে সুপারিশ করা হয় (যদি না অন্যথায় করার নির্দিষ্ট কারণ না থাকে তবে) যেহেতু একটি উন্মুক্ত লেনদেনের সাথে সংযোগ নিয়ে কাজ করার কোনও অ্যাপ্লিকেশনের পরিণতি বিপর্যয়কর।
ড্যান গুজম্যানের ব্লগে সত্যিই দুর্দান্ত একটি ওভারভিউ রয়েছে ,
BEGIN TRY- BEGIN CATCHএবং ROLLBACKসঙ্গে BEGIN CATCHSQL ব্লক?
BEGIN TRY- BEGIN CATCHক্লায়েন্ট অ্যাপ্লিকেশনটিতে সময়সীমা নির্ধারণের মতো জিনিসগুলি ধরবে না এবং কিছু এসকিউএল ত্রুটিও অপ্রকাশনীয়, এমন একটি উন্মুক্ত লেনদেনের সাথে আপনাকে ফেলে রাখবে যেখানে আপনি প্রত্যাশা করবেন না।
আমার মতে এসইকিউএল 2 কে 5 এ বিগইন ট্রাই / শুরু করা ক্যাচ যোগ করে SET XACT_ABORT অনকে অচল করে দেওয়া হয়েছিল। লেনদেন-এসকিউএল ব্যতিক্রম ব্লকগুলির আগে ত্রুটিগুলি পরিচালনা করা সত্যিই কঠিন ছিল এবং ভারসাম্যহীন পদ্ধতিগুলি খুব সাধারণ ছিল (প্রবেশপথের তুলনায় প্রস্থানটিতে পৃথক @@ ট্রানসেন্ট ছিল এমন পদ্ধতিগুলি)।
লেনদেন-এসকিউএল ব্যতিক্রম হ্যান্ডলিং লেনদেন সঠিকভাবে ভারসাম্য গ্যারান্টিযুক্ত সঠিক পদ্ধতি লিখতে অনেক সহজ। উদাহরণস্বরূপ আমি ব্যতিক্রম হ্যান্ডলিং এবং নেস্টেড লেনদেনের জন্য এই টেম্পলেটটি ব্যবহার করি :
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
go
এটি আমাকে পারমাণবিক পদ্ধতিগুলি লেখার অনুমতি দেয় যা পুনরুদ্ধারযোগ্য ত্রুটির ক্ষেত্রে কেবল তাদের নিজস্ব কাজটি রোলব্যাক করে।
লেনদেন-এসকিউএল পদ্ধতিগুলির মুখোমুখি মূল বিষয়গুলির মধ্যে একটি হ'ল ডেটা বিশুদ্ধতা : কখনও কখনও প্রাপ্ত প্যারামিটারগুলি বা সারণীতে থাকা ডেটাগুলি কেবল সাধারণ ভুল হয়, ফলে ডুপ্লিকেট কী ত্রুটি হয়, রেফারেন্টাল সীমাবদ্ধতা ত্রুটি হয়, বাধা ত্রুটিগুলি পরীক্ষা করে এবং আরও অনেক কিছু forth সর্বোপরি, এই সীমাবদ্ধতার ঠিক এটিই ভূমিকা, যদি এই ডেটা বিশুদ্ধতা ত্রুটিগুলি অসম্ভব হয়ে পড়ে এবং সমস্ত ব্যবসায়িক যুক্তি দ্বারা ধরা পড়ে, তবে এই সীমাবদ্ধতাগুলি সমস্ত অপ্রচলিত হয়ে উঠবে (নাটকীয়ভাবে অতিরঞ্জিত প্রভাবের জন্য যুক্ত)। যদি XACT_ABORT চালু থাকে তবে এই সমস্ত ত্রুটিগুলির ফলস্বরূপ পুরো লেনদেনটি নষ্ট হয়ে যায়, ব্যতিক্রমগুলি হস্তক্ষেপে পরিচালনা করে এমন ব্যতিক্রম ব্লকগুলি কোড করতে সক্ষম হওয়ার বিপরীতে। একটি সাধারণ উদাহরণ একটি INSERT করার চেষ্টা করছে এবং পিকে লঙ্ঘনে একটি আপডেটে ফিরে যাচ্ছে।
এমএসডিএন উদ্ধৃত :
যখন SET XACT_ABORT চালু থাকে, যদি কোনও লেনদেন-এসকিউএল বিবৃতি রান-টাইম ত্রুটি উত্থাপন করে, পুরো লেনদেনটি বন্ধ হয়ে যায় এবং ফিরে আসে। যখন এসইটি XACT_ABORT বন্ধ থাকে, কিছু ক্ষেত্রে কেবল ত্রুটি উত্থাপিত ট্রান্সঅ্যাক্ট-এসকিউএল বিবৃতি আবার ঘুরিয়ে দেওয়া হয় এবং লেনদেন প্রক্রিয়াজাতকরণ অব্যাহত থাকে।
অনুশীলনে এর অর্থ হ'ল কিছু বিবৃতি ব্যর্থ হতে পারে এবং লেনদেনটিকে 'আংশিকভাবে সম্পন্ন' রেখে যায় এবং একজন কলারের পক্ষে এই ব্যর্থতার কোনও চিহ্ন থাকতে পারে না।
একটি সহজ উদাহরণ:
INSERT INTO t1 VALUES (1/0)
INSERT INTO t2 VALUES (1/1)
SELECT 'Everything is fine'
এই কোডটি XACT_ABORT OFF দিয়ে 'সাফল্যের সাথে' কার্যকর করবে এবং XACT_ABORT অন দিয়ে একটি ত্রুটি দিয়ে শেষ করবে ('INSERT INTO t2' কার্যকর হবে না, এবং একটি ক্লায়েন্ট অ্যাপ্লিকেশন ব্যতিক্রম উত্থাপন করবে)।
আরও নমনীয় পদ্ধতির হিসাবে, আপনি প্রতিটি বিবৃতি (পুরানো স্কুল) এর পরে @@ ERROR পরীক্ষা করতে বা ট্রাই ... ক্যাচ ব্লক (এমএসএসকিউএল ২০০৫ +) ব্যবহার করতে পারেন। ব্যক্তিগতভাবে আমি যখনই কিছু উন্নত ত্রুটি পরিচালনার কোনও কারণ নেই তখনই আমি XACT_ABORT সেট করতে পছন্দ করি।
ক্লায়েন্টের সময়সীমা এবং এগুলি পরিচালনা করতে XACT_ABORT এর ব্যবহার সম্পর্কে, আমার মতে এসকিএলসি্লায়েন্টের মতো ক্লায়েন্টের এপিআইগুলিতে টাইমআউট হওয়ার কমপক্ষে একটি খুব ভাল কারণ রয়েছে এবং তা হচ্ছে এসকিউএল সার্ভার কোডে সংঘটিত ডেডলকগুলি থেকে ক্লায়েন্ট অ্যাপ্লিকেশন কোডটি রক্ষা করা। এক্ষেত্রে ক্লায়েন্ট কোডটির কোনও দোষ নেই, তবে সার্ভারে কমান্ডটি শেষ হওয়ার অপেক্ষায় চিরকালের জন্য অবরুদ্ধ থেকে নিজেকে রক্ষা করতে হবে। বিপরীতভাবে, ক্লায়েন্টের কোডগুলি সুরক্ষার জন্য যদি ক্লায়েন্টের সময়সীমা উপস্থিত থাকতে হয়, তবে ক্লায়েন্টের অপেক্ষায় সার্ভার কোডটি ক্লায়েন্টের বিহীনতা থেকে রক্ষা করতে হবে, যদি ক্লায়েন্ট অপেক্ষা করতে ইচ্ছুক হয় তার চেয়ে সার্ভার কোডটি কার্যকর করতে বেশি সময় নেয়।
লেনদেনের পিছনে কোনও ত্রুটি হওয়ার ফলস্বরূপ তা নিশ্চিত করতে এটি লেনদেন পরিচালনায় ব্যবহৃত হয়।