ডিফল্টরূপে, লেনদেনগুলি বেশিরভাগ সময় হয়, যখন কোনও ত্রুটি ঘটে তখন স্বয়ংক্রিয়ভাবে ঘূর্ণিত-ব্যাক / বাতিল হয় না। আপনার যথাযথ ত্রুটি পরিচালনা করা এবং ROLLBACK
নিজেকে কল করা পর্যন্ত এটি সাধারণত কোনও সমস্যা হয় না । যাইহোক, কখনও কখনও জিনিসগুলি জটিল হয়ে যায়, যেমন ব্যাচ-গর্ভপাত ত্রুটির ক্ষেত্রে বা OPENQUERY
(বা সাধারণভাবে সংযুক্ত সার্ভারগুলি) ব্যবহার করার সময় এবং রিমোট সিস্টেমে একটি ত্রুটি দেখা দেয়। বেশিরভাগ ত্রুটিগুলি ব্যবহার করে আটকা TRY...CATCH
পড়তে পারে, তবে দুটি আছে যা সেভাবে আটকা যায় না (এই মুহূর্তে কোনটি মনে করতে পারে না, যদিও - গবেষণা করছে)। এই ক্ষেত্রে, আপনার অবশ্যই SET XACT_ABORT ON
লেনদেনের রোলব্যাক সঠিকভাবে ব্যবহার করতে হবে ।
এসইটি XACT_ABORT অন এসকিউএল সার্ভারকে তত্ক্ষণাত যে কোনও লেনদেনের রোল-ব্যাক করতে দেয় (যদি কেউ সক্রিয় থাকে) এবং কোনও ত্রুটি দেখা দিলে ব্যাচটি বাতিল করতে হবে । এই সেটিংটি এসকিউএল সার্ভার ২০০৫ এর আগে বিদ্যমান ছিল, যা TRY...CATCH
নির্মাণের সূচনা করেছিল । বেশিরভাগ ক্ষেত্রে, TRY...CATCH
বেশিরভাগ পরিস্থিতি পরিচালনা করে এবং তাই বেশিরভাগ ক্ষেত্রে প্রয়োজনটি অপ্রচলিত করে XACT_ABORT ON
। যাইহোক, ব্যবহার করার সময় OPENQUERY
(এবং সম্ভবত অন্য একটি দৃশ্য যা আমি এই মুহুর্তে মনে করতে পারি না), তারপরে আপনাকে এখনও ব্যবহার করতে হবে SET XACT_ABORT ON;
।
আপনার সর্বদা সঠিক ত্রুটি পরিচালনা করা উচিত, বিশেষত যখন লেনদেনগুলি ব্যবহার করার সময়। TRY...CATCH
কনস্ট্রাক্ট, এসকিউএল সার্ভার 2005 সালে চালু, প্রায় সব পরিস্থিতিতে জন্য পরীক্ষা উপর একটি স্বাগত উন্নতি হ্যান্ডলিং একটি উপায় প্রদান করে @@ERROR
প্রতিটি বিবৃতি, যা ব্যাচ-গর্ভপাত ত্রুটিযুক্ত অনেক সাহায্য করা হয়নি পরে।
TRY...CATCH
তবে একটি নতুন "রাষ্ট্র" চালু করেছে। যখন না ব্যবহার TRY...CATCH
কনস্ট্রাক্ট, যদি আপনি একটি সক্রিয় লেনদেন আছে এবং একটি ত্রুটি ঘটে, তারপর সেখানে বিভিন্ন পাথ যে গ্রহণ করা যেতে পারে আছে:
XACT_ABORT OFF
এবং বিবৃতি-বিলোপ ত্রুটি: লেনদেন এখনও সক্রিয় এবং পরবর্তী বিবৃতি , যদি থাকে তবে প্রক্রিয়া চলতে থাকে।
XACT_ABORT OFF
এবং সর্বাধিক ব্যাচ-গর্ভপাত ত্রুটি: লেনদেন এখনও সক্রিয় রয়েছে এবং পরবর্তী ব্যাচে যদি প্রক্রিয়া থাকে তবে প্রক্রিয়াজাতকরণ অব্যাহত থাকে।
XACT_ABORT OFF
এবং নির্দিষ্ট ব্যাচ-গর্ভপাত ত্রুটি: লেনদেনটি ঘূর্ণিত হয় এবং যদি থাকে তবে পরবর্তী ব্যাচে প্রক্রিয়াজাতকরণ অব্যাহত থাকে।
XACT_ABORT ON
এবং যে কোনও ত্রুটি: লেনদেনটি রোলড-ব্যাক হয় এবং প্রক্রিয়াটি যদি থাকে তবে পরবর্তী ব্যাচটি দিয়ে চলতে থাকে if
তবুও, ব্যবহার করার সময় TRY...CATCH
, ব্যাচ-গর্ভাবস্থার ত্রুটিগুলি ব্যাচটি বাতিল না করে পরিবর্তে CATCH
ব্লকটিতে নিয়ন্ত্রণ স্থানান্তর করে । কখন XACT_ABORT
হয় OFF
, লেনদেন এখনও সময়ের বেশিরভাগ অংশে সক্রিয় থাকবে এবং আপনাকে COMMIT
, বা সম্ভবত সম্ভবত, প্রয়োজন হবে ROLLBACK
। তবে যখন নির্দিষ্ট ব্যাচ-গর্ভপাত ত্রুটির মুখোমুখি হওয়া (যেমন সহ OPENQUERY
) বা যখন XACT_ABORT
হয় ON
তখন লেনদেনটি একটি নতুন অবস্থায় থাকবে, "আপত্তিজনক"। এই অবস্থায় আপনি পারবেন না COMMIT
, আপনি কোনও ডিএমএল অপারেশনও করতে পারবেন না । আপনি যা করতে পারেন তা হ'ল ROLLBACK
এবং SELECT
বিবৃতি। যাইহোক, এই "আপত্তিজনক" অবস্থায়, ত্রুটিটি ঘটতে থাকলে লেনদেনটি ঘুরিয়ে দেওয়া হয়েছিল, এবং জারি ROLLBACK
করা কেবল একটি আনুষ্ঠানিকতা, তবে একটি অবশ্যই করা উচিত।
কোনও ক্রিয়াকলাপ, XACT_STATE , কোনও লেনদেন সক্রিয়, আপত্তিজনক বা উপস্থিত না থাকলে তা নির্ধারণ করতে ব্যবহার করা যেতে পারে। ফলাফল পরীক্ষা CATCH
করার -1
পরিবর্তে ফলাফল (অর্থাত্ অবিস্মরণীয় ) আছে কিনা তা নির্ধারণ করার জন্য ব্লকের এই ফাংশনটি পরীক্ষা করার জন্য (কিছু দ্বারা কমপক্ষে) সুপারিশ করা হয় @@TRANCOUNT > 0
। কিন্তু XACT_ABORT ON
যে হওয়া উচিত শুধুমাত্র সম্ভব রাষ্ট্র, হতে তাই এটি যে পরীক্ষামূলক বলে মনে হয় @@TRANCOUNT > 0
এবং XACT_STATE() <> 0
সমতুল্য। অন্যদিকে, যখন XACT_ABORT
হয় OFF
এবং সেখানে একটি সক্রিয় লেনদেন হয়, তাহলে এটা সম্ভব হয় একটি রাষ্ট্র আছে হয় 1
বা -1
এ CATCH
ব্লক, যা জারি করে প্রতারণা করতে পারবে COMMIT
পরিবর্তে ROLLBACK
যখন কারোর জন্য (যদিও, আমি একটি মামলার ভাবতে পারি না চাইবেCOMMIT
যদি লেনদেনটি কমিটমেন্টযোগ্য হয়)। XACT_STATE()
একটি CATCH
ব্লকের মধ্যে ব্যবহারের বিষয়ে আরও তথ্য এবং গবেষণা XACT_ABORT ON
নিম্নলিখিত ডিবিএ.এসই প্রশ্নের উত্তরে পাওয়া যাবে: XACT_ABORT চালু হওয়ার পরে কোন ক্ষেত্রে ক্যাচ ব্লকের অভ্যন্তর থেকে কোনও লেনদেন করা যেতে পারে? । দয়া করে মনে রাখবেন যে এখানে একটি ছোট্ট ত্রুটি রয়েছে XACT_STATE()
যার ফলে এটি 1
কিছু পরিস্থিতিতে ভুলভাবে ফিরে আসে : কিছু সিস্টেম ভেরিয়েবলের সাথে SEF এ ব্যবহৃত হয় তবে FROM ধারা ছাড়াই XACT_STATE () 1 প্রদান করে
spNewBilling3
কোনও ত্রুটি নিক্ষেপ করে তবে আপনি ফিরে রোল করতে চান নাspNewBilling2
বাspNewBilling1
, তবে কেবল এখান[begin|rollback|commit] transaction createSavebillinginvoice
থেকে সরিয়ে দিনspSavesomename
।