এসকিউএল 2005 সঞ্চিত প্রকসগুলিতে ত্রুটি পরিচালনা করার জন্য সর্বোত্তম পদ্ধতি কী?


11

সঞ্চিত প্রকল্পগুলি যথেষ্ট শক্তিশালী করার একটি ভাল উপায় কী যে তারা খুব ভাল স্কেল করতে পারে এবং এতে ত্রুটি পরিচালনাও থাকতে পারে?

অধিকন্তু, কোনও সঞ্চিত প্রকল্পে একাধিক ত্রুটি পরিস্থিতি পরিচালনা করার এবং বুদ্ধিমান প্রতিক্রিয়া সিস্টেম রয়েছে যা কলিং অ্যাপগুলিতে অর্থবহ ত্রুটির তথ্য ফেরত দেবে তার সেরা উপায় কী?


2
এসকিউএল সার্ভার ২০০৫-এ নতুন ট্রাই ক্যাচ ব্লকটি ব্যবহার করার চেষ্টা করুন s sommarskog.se/error_handling_2005.html
সংকর রেড্ডি

হাই @ ক্যাকালাপি ~ আমি ভবিষ্যতে প্রতিটি প্রশ্নকে তার নিজের মত করে জিজ্ঞাসা করতে চাই এবং সেই সাথে আমাদের একসাথে একটি প্রশ্নের উপর নির্দিষ্ট উত্তর থাকতে পারে। আমি আপনাকে এই প্রশ্নটি করতে উত্সাহিত করি।
jcolebrand

উত্তর:


12

অ্যালেক্স কুজনেটসভের তাঁর ডিফেন্সিভ ডেটাবেস প্রোগ্রামিং (অধ্যায় 8) বইয়ের একটি দুর্দান্ত অধ্যায় রয়েছে যা টি-এসকিউএল ট্রায় ... ক্যাচ, টি-এসকিউএল লেনদেন এবং সেট সেট এক্সএসিএসএবির্ট সেটিংস এবং ক্লায়েন্ট-সাইড ত্রুটি হ্যান্ডলিং ব্যবহার করে using আপনার কী অর্জন করতে হবে তার জন্য কোন বিকল্পগুলি সর্বাধিক বোধ করে তা স্থির করতে আপনাকে অনেক সহায়তা করবে help

এটা তোলে জন্য উপলব্ধ বিনামূল্যেএই সাইটের । আমি কোনওভাবেই সংস্থার সাথে সম্পর্কিত নই, তবে আমি সেই বইয়ের হার্ড কপি সংস্করণের মালিক do

অ্যালেক্স দ্বারা খুব ভাল ব্যাখ্যা করা হয়েছে যে এই বিষয়ে অনেক ছোট বিবরণ আছে।

পার নিকের অনুরোধ ... (তবে এই সমস্তটি অধ্যায়টিতে নেই)

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

যোগাযোগের সবচেয়ে সহজ উপায় হ'ল কাস্টম ত্রুটি কোড (> 50,000)। এটিও বেশ দ্রুত। এর অর্থ এই নয় যে আপনাকে ডিবি কোড এবং অ্যাপ কোডটি সিঙ্কে রাখতে হবে। একটি কাস্টম ত্রুটি কোড সহ, আপনি ত্রুটি বার্তা স্ট্রিংয়ে দরকারী তথ্যও ফিরে আসতে পারেন। আপনার সেই পরিস্থিতিতে কঠোরতার জন্য একটি ত্রুটি কোড রয়েছে তাই আপনি ত্রুটির ডেটা ফর্ম্যাট অনুসারে অ্যাপ কোডটিতে একটি পার্সার লিখতে পারেন।

এছাড়াও, কোন ত্রুটি শর্তের জন্য ডাটাবেসে পুনরায় চেষ্টা করার যুক্তি প্রয়োজন? আপনি যদি X সেকেন্ড পরে আবার চেষ্টা করতে চান, তবে অ্যাপ্লিকেশন কোডটিতে এটি পরিচালনা করা আপনার পক্ষে আরও ভাল যাতে লেনদেন এতটা ব্লক না করে। আপনি যদি এখনই কেবল ডিএমএল অপারেশনটি পুনরায় জমা দিচ্ছেন তবে এসপিতে পুনরাবৃত্তি করা আরও কার্যকর হতে পারে। তবে মনে রাখবেন, আপনাকে পুনরায় চেষ্টা করার জন্য আপনাকে সম্ভবত নকল কোড বা এসপিগুলির একটি স্তর যুক্ত করতে হবে।

সত্যই, এটি বর্তমানে ট্রাইয়ের সাথে সবচেয়ে বড় ব্যথা ... এই মুহূর্তে এসকিউএল সার্ভারে ক্যাচ যুক্তি। এটি করা যেতে পারে তবে এটি একটি অল্প কিছুটা। এসকিউএল সার্ভার ২০১২-তে এর কিছু পরিবর্তন আসছে, বিশেষত সিস্টেম ব্যতিক্রম পুনরায় নিক্ষেপ (মূল ত্রুটির নম্বর সংরক্ষণ করে) Look এছাড়াও, ফরমেটমেসেজ রয়েছে যা ত্রুটি বার্তা তৈরিতে কিছুটা নমনীয়তা যুক্ত করে, বিশেষত লগিংয়ের উদ্দেশ্যে।


দুর্দান্ত পরামর্শ এবং খুব ভাল বই!
মারিয়ান

রেড গেট কয়েকটি অত্যন্ত সহায়ক নিখরচায় ই-বই সরবরাহ করে এবং এটি অবশ্যই আরও ভাল একটি। দুর্দান্ত পরামর্শ।
ম্যাট এম

তাদের সমস্ত বই এটি করে না, তবে কুজনেটসভের "ডিফেন্সিভ ..." বইয়ের ফ্রি সংস্করণে লেনদেনের বিচ্ছিন্নতা স্তর এবং বিকাশকারী পরিবর্তনসমূহের শেষ 2 টি অধ্যায় নেই যা সম্মতিতে টিকে আছে। আমার জন্য. সেখানে থাকা সামগ্রীটি কেনার মূল্য ছিল।
ফিল হেলমার

7

এটি আমাদের টেমপ্লেট (ত্রুটিযুক্ত লগিং অপসারণ)

মন্তব্য:

  • XACT_ABORT ব্যতীত, সমস্ত টিএক্সএন শুরু এবং প্রতিশ্রুতিবদ্ধ / রোলব্যাক যুক্ত করতে হবে
  • একটি প্রতিশ্রুতি কমেছে @@ ট্রানকাউন্ট
  • একটি রোলব্যাক @@ TRANCOUNT শূন্যে ফেরায় যাতে আপনি ত্রুটি 266 পেয়ে যাবেন
  • আপনি কেবলমাত্র বর্তমান স্তরটি রোলব্যাক করতে পারবেন না (উদাহরণস্বরূপ রোলব্যাকের ক্ষেত্রে হ্রাস @@ ট্রান্সট)
  • XACT_ABORT ত্রুটি 266 দমন করে
  • প্রতিটি সঞ্চিত প্রোকে একই টেমপ্লেটের সাথে সামঞ্জস্য করতে হবে যাতে প্রতিটি কলটি পারমাণবিক হয়
  • রোলব্যাক চেকটি XACT_ABORT এর কারণে আসলে রিডানড্যান্ট। যাইহোক, এটি আমাকে আরও ভাল বোধ করে, অদ্ভুত দেখায়, এবং যেখানে আপনি এটি চান না তার জন্য অনুমতি দেয়
  • এটি ক্লায়েন্টের পক্ষের TXNs (লিনকুইয়ের মতো) এর জন্য অনুমতি দেয়
  • রিমাস রুসানুর একটি অনুরূপ শেল রয়েছে যা সেভ পয়েন্টগুলি ব্যবহার করে। আমি একটি পারমাণবিক ডিবি কল পছন্দ করি এবং তাদের নিবন্ধের মতো আংশিক আপডেট ব্যবহার করি না

... সুতরাং আপনার প্রয়োজনের চেয়ে বেশি টিএক্সএন তৈরি করবেন না

যাহোক,

CREATE PROCEDURE [Name]
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0
        BEGIN TRANSACTION

       [...Perform work, call nested procedures...]

    IF @starttrancount = 0 
        COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO

যদি @@ ট্রানকাউন্ট 0 এর চেয়ে বেশি হয় তবে কী হবে? আপনি কোন কাজ না বা কোন প্রতিক্রিয়া আছে?
কাকালাপি

@kacalapy: একটি নেস্টেড লেনদেন যেমন জিনিস তাই আমরা অন্য না শুরু আছে scribd.com/doc/49579859/33/Nested-Transactions-Are-Real
gbn

3

আমি ট্রাই / ক্যাচ ব্যবহার করি তবে আমি যথাসম্ভব তথ্য সংগ্রহ করি এবং রোলব্যাকের পরে এটি একটি ত্রুটিমুক্ত লিখি। এই উদাহরণে, "লগইভেন্ট" হ'ল একটি সঞ্চিত পদ্ধতি যা ঘটনার বিবরণ সম্বলিত ইভেন্টলগ টেবিলকে লিখবে। GetErrorInfo () হ'ল একটি ফাংশন কল যা সঠিক ত্রুটির বার্তা দেয়।

ত্রুটি দেখা দিলে, তথ্য সংগ্রহ করা হয়, পদ্ধতিটি ত্রুটি পরিচালনার বিভাগে চলে যায় এবং একটি রোলব্যাক জারি করে। তথ্য লগতে লিখিত হয়, তারপরে পদ্ধতিটি প্রস্থান করে।

জড়িত অতিরিক্ত প্রক্রিয়া / ফাংশন কল বিবেচনা করে, এটি শীর্ষ থেকে কিছুটা বেশি মনে হচ্ছে। সমস্যাটি ডিবাগ করার চেষ্টা করার পরেও এই পদ্ধতিটি অত্যন্ত সহায়ক helpful

এক্সিকিউটিভ লগইভেন্ট @ প্রসেস, @ ডেটাবেস, 'ব্লাহ ব্লাহ ব্লাহ lahোকানোর চেষ্টা করা হচ্ছে'
শুরু করুন
  মাই টেবিল .োকান
  মান নির্বাচন করুন
    মায়োথেরটেবল থেকে

  @rowcount = @@ ROWCOUNT নির্বাচন করুন
শেষ চেষ্টা করুন
-- ত্রুটি পরিচালনা
শুরু ক্যাচ
  @error = ERROR_NUMBER () নির্বাচন করুন,
         @ ক্রোকাউন্ট = -1,
         @ টেবিলঅ্যাকশন = 'সন্নিবেশ',
         @ টেবিলনাম = @ ডেটাবেস + '.মাইটিবেল',
         @AdditionalInfo = '(ব্লাহ ব্লাহ ব্লাহ sertোকানোর চেষ্টা করা হচ্ছে)'
   গোটো টেবিলঅ্যাক্সেসেরর
সমাপ্তি ক্যাচ

।
।
।
।

TableAccessError:
IF (@@ ট্র্যান্ট অ্যাকাউন্ট 0) রোলব্যাক
@ আউটপুট = উপরের (@ টেবিলঅ্যাকশন) + নির্বাচন করুন 
       'ত্রুটি - যখন একটি ত্রুটি ঘটেছে' + 
       কেস (@ টেবিলঅ্যাকশন)
         যখন 'আপডেট' তখন 'আপডেট করা'
         যখন 'মুছুন' তখন 'মোছা'
         অন্যথায় @ টেবিলঅ্যাকশন + 'ইনগ'
       শেষ + 
       'রেকর্ড' + 
       কেস (@TableAction) 
         যখন 'তখন' থেকে 'নির্বাচন করুন' 
         যখন 'আপডেট' তখন 'ইন' 
         যখন 'সন্নিবেশ' তখন 'ভিতরে'
         অন্য 'থেকে'   
         শেষ + 
         '' '+ @ টেবিলনাম +' সারণী ''
@ আউটপুট = @ আউটপুট + '@@ এয়ারআর:' + রূপান্তর (বারচর (8), @ ত্রুটি) নির্বাচন করুন 
@ আউটপুট = @ আউটপুট + '@@ রউউউণ্ট:' + রূপান্তর (বারচর (8), @ সারি হিসাব) নির্বাচন করুন 

@ আউটপুট = @ আউটপুট + ইসনুল (@ অ্যাডিশনালআইএনফো, '') নির্বাচন করুন
এক্সপ্লোর পরিচালনা লগইভেন্ট @ প্রসেস, @ ডেটাবেস, @ আউটপুট
লগ সহ RAISERROR (@ আউটপুট, 16,1)
@ রিটারনকোড = -1 নির্বাচন করুন
যাও THE_EXIT


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