সঞ্চিত পদ্ধতিতে "SET XACT_ABORT চালু" ব্যবহারের সুবিধা কী?


177

SET XACT_ABORT ONসঞ্চিত পদ্ধতিতে ব্যবহার করে কী লাভ ?


2
সুবিধার জন্য MSDN সুত্র: msdn.microsoft.com/en-us/library/ms188792.aspx
টিম Abell

3
এটি সম্পর্কে এটি সত্যিই একটি ভাল নিবন্ধ: sommarskog.se/error_handling/Part1.html
বিপরীত প্রকৌশলী

উত্তর:


231

SET XACT_ABORT ONএসকিউএল সার্ভারকে পুরো লেনদেনটি রোলব্যাক করতে এবং রান-টাইম ত্রুটি দেখা দিলে ব্যাচটি বাতিল করতে নির্দেশ দেয়। এটি আপনাকে এসকিউএল সার্ভারের মধ্যে না হয়ে ক্লায়েন্ট অ্যাপ্লিকেশনটিতে কমান্ড টাইমআউট হওয়ার মতো ক্ষেত্রে (যা ডিফল্ট XACT_ABORT OFFসেটিংসের আওতায় আসে না isn't

যেহেতু কোনও ক্যোয়ারির সময়সীমা লেনদেনটি উন্মুক্ত ছেড়ে দেবে, SET XACT_ABORT ONসমস্ত স্পষ্ট পদ্ধতিতে সুস্পষ্ট লেনদেনের সাথে সুপারিশ করা হয় (যদি না অন্যথায় করার নির্দিষ্ট কারণ না থাকে তবে) যেহেতু একটি উন্মুক্ত লেনদেনের সাথে সংযোগ নিয়ে কাজ করার কোনও অ্যাপ্লিকেশনের পরিণতি বিপর্যয়কর।

ড্যান গুজম্যানের ব্লগে সত্যিই দুর্দান্ত একটি ওভারভিউ রয়েছে ,


41
সুতরাং এটি ডিফল্টরূপে কেন নয়?
মাইক ডব্লিউ

1
XACT_ABORT এখনও প্রয়োজন বোধ করা হয় যদি আপনার BEGIN TRY- BEGIN CATCHএবং ROLLBACKসঙ্গে BEGIN CATCHSQL ব্লক?
ব্যবহারকারী 20358

1
@ ইউজার ২০৩৮৮ BEGIN TRY- BEGIN CATCHক্লায়েন্ট অ্যাপ্লিকেশনটিতে সময়সীমা নির্ধারণের মতো জিনিসগুলি ধরবে না এবং কিছু এসকিউএল ত্রুটিও অপ্রকাশনীয়, এমন একটি উন্মুক্ত লেনদেনের সাথে আপনাকে ফেলে রাখবে যেখানে আপনি প্রত্যাশা করবেন না।
টম লিন্ট

37

আমার মতে এসইকিউএল 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 করার চেষ্টা করছে এবং পিকে লঙ্ঘনে একটি আপডেটে ফিরে যাচ্ছে।


9
ক্লায়েন্টের সময়সীমা ব্যতীত ... এবং আমার দৃষ্টিভঙ্গি এসকিউএল 2005-এ SET XACT_ABORT বেশি কার্যকর কারণ আচরণটি আরও অনুমানযোগ্য: অনেক কম ব্যাচ গর্ভপাত ত্রুটি রয়েছে।
gbn

7
আমি কিছুটা হলেও একমত, তবে আমি সমস্ত ঘটনাচক্রে আমার ত্রুটিটি পরিচালনা করার পরিকল্পনা করি, কারণ আমি জানি যে কমান্ডের সময়সীমা শেষ হলে আমি বিকাশকারী ডিবিএ হিসাবে দোষ পাব।
gbn

4
@ রেমুসরুসানু আপনি কীভাবে দীর্ঘকাল চলমান, সিনক্রোনাস, ডাটাবেস অপারেশন পরিচালনা করবেন?
ইয়ান বয়ড

5
এমএসডিএন ডকুমেন্টেশনটিতে বলা হয়েছে: "এসকিউএল সার্ভার সহ বেশিরভাগ ওএলই ডিবি সরবরাহকারীদের বিরুদ্ধে একটি স্পষ্ট বা স্পষ্ট লেনদেনের ক্ষেত্রে ডেটা সংশোধন বিবরণের জন্য XACT_ABORT টি চালু রাখতে হবে provider কেবলমাত্র যেখানে বিকল্পের প্রয়োজন হয় না, যদি সরবরাহকারী নেস্টেড লেনদেন সমর্থন করে।" msdn.microsoft.com/en-us/library/ms188792(v=sql.120).aspx
নাথান

4
"আমার মতে SEX XACT_ABORT চালু করা শুরু হয়েছিল বিগইন ট্রাই / বিগিন ক্যাচ যোগ করে" - আমি আপনাকে শুনেছি তবে দয়া করে sommarskog.se/error_handling/Part1.html দেখুন
বিপরীত প্রকৌশলী

22

এমএসডিএন উদ্ধৃত :

যখন 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 সেট করতে পছন্দ করি।


8

ক্লায়েন্টের সময়সীমা এবং এগুলি পরিচালনা করতে XACT_ABORT এর ব্যবহার সম্পর্কে, আমার মতে এসকিএলসি্লায়েন্টের মতো ক্লায়েন্টের এপিআইগুলিতে টাইমআউট হওয়ার কমপক্ষে একটি খুব ভাল কারণ রয়েছে এবং তা হচ্ছে এসকিউএল সার্ভার কোডে সংঘটিত ডেডলকগুলি থেকে ক্লায়েন্ট অ্যাপ্লিকেশন কোডটি রক্ষা করা। এক্ষেত্রে ক্লায়েন্ট কোডটির কোনও দোষ নেই, তবে সার্ভারে কমান্ডটি শেষ হওয়ার অপেক্ষায় চিরকালের জন্য অবরুদ্ধ থেকে নিজেকে রক্ষা করতে হবে। বিপরীতভাবে, ক্লায়েন্টের কোডগুলি সুরক্ষার জন্য যদি ক্লায়েন্টের সময়সীমা উপস্থিত থাকতে হয়, তবে ক্লায়েন্টের অপেক্ষায় সার্ভার কোডটি ক্লায়েন্টের বিহীনতা থেকে রক্ষা করতে হবে, যদি ক্লায়েন্ট অপেক্ষা করতে ইচ্ছুক হয় তার চেয়ে সার্ভার কোডটি কার্যকর করতে বেশি সময় নেয়।


1

লেনদেনের পিছনে কোনও ত্রুটি হওয়ার ফলস্বরূপ তা নিশ্চিত করতে এটি লেনদেন পরিচালনায় ব্যবহৃত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.