একই প্রশ্নগুলি বজায় রেখে অচলাবস্থা রোধ করার কোনও উপায় আছে কি?
অচলাবস্থা গ্রাফটি দেখায় যে এই নির্দিষ্ট অচলাবস্থাটি একটি বুকমার্ক লুকের সাথে সম্পর্কিত একটি রূপান্তর অচলতা ছিল (এই ক্ষেত্রে একটি আরআইডি লুকোচুরি):
প্রশ্ন নোট হিসাবে, সাধারণ অচলাবস্থা ঝুঁকি দেখা দেয় কারণ প্রশ্নগুলি বিভিন্ন ক্রমে একই সংস্থানগুলিতে অসম্পূর্ণ লকগুলি পেতে পারে। SELECT
ক্যোয়ারী, পরিত্রাণ লুকআপ কারণে টেবিল সামনে সূচক অ্যাক্সেস করতে যেহেতু প্রয়োজন UPDATE
সূচক ক্যোয়ারী মডিফাই টেবিল প্রথম, তারপর।
অচলাবস্থা দূর করতে ডেডলক উপাদানগুলির একটি অপসারণ করা দরকার। নিম্নলিখিত প্রধান বিকল্পগুলি:
- অবিচ্ছিন্ন সূচককে আচ্ছাদন করে আরআইডি লুকআপ এড়িয়ে চলুন। এটি সম্ভবত আপনার ক্ষেত্রে ব্যবহারিক নয় কারণ
SELECT
ক্যোয়ারীটিতে 26 টি কলাম ফিরে আসে।
- একটি ক্লাস্টার্ড সূচক তৈরি করে আরআইডি লুকআপ এড়ান। এটি কলামে একটি ক্লাস্টার ইনডেক্স তৈরি করতে জড়িত
Proposal
। এটি বিবেচনা করার মতো, যদিও এটি প্রকাশিত হয়েছে যে এই কলামটি প্রকারের uniqueidentifier
, যা বৃহত্তর ইস্যুগুলির উপর নির্ভর করে ক্লাস্টারড সূচকের জন্য ভাল পছন্দ বা নাও হতে পারে।
READ_COMMITTED_SNAPSHOT
বা SNAPSHOT
ডাটাবেস বিকল্পগুলি সক্ষম করে পড়ার সময় ভাগ করা লকগুলি এড়িয়ে চলুন । এটির জন্য বিশেষত কোনও ডিজাইন-ইন ব্লক করা আচরণের ক্ষেত্রে যত্ন সহকারে পরীক্ষা করা প্রয়োজন। যুক্তি সঠিকভাবে সম্পাদন করে তা নিশ্চিত করতে ট্রিগার কোডেরও পরীক্ষার প্রয়োজন হয়।
- ক্যোয়ারির
READ UNCOMMITTED
জন্য বিচ্ছিন্নতা স্তরটি ব্যবহার করে পড়ার সময় ভাগ করা লকগুলি এড়িয়ে চলুন SELECT
। সমস্ত স্বাভাবিক সতর্কতা প্রয়োগ করা হয়।
- একচেটিয়া অ্যাপ্লিকেশন লক ( sp_getapplock দেখুন ) ব্যবহার করে প্রশ্নে দুটি প্রশ্নের একযোগে কার্যকর হওয়া এড়িয়ে চলুন ।
- সামঞ্জস্যতা এড়াতে টেবিল লক ইঙ্গিতগুলি ব্যবহার করুন। এটি বিকল্প 5 এর চেয়ে বড় হাতুড়ি, কারণ এটি অন্যান্য প্রশ্নের উপর প্রভাব ফেলতে পারে, কেবলমাত্র প্রশ্নের মধ্যে চিহ্নিত দু'জন নয়।
টেবিল এবং সূচী অ্যাক্সেস একই ক্রমে রয়েছে তা নিশ্চিত করার জন্য আপডেটের আগে আপডেটের লেনদেনে সূচিতে আমি কোনওভাবে এক্স-লক নিতে পারি?
আপনি একটি সুস্পষ্ট লেনদেনে আপডেটটি মুড়ে এবং আপডেটের আগে নন-ক্ল্লাস্টার্ড সূচক মানটিতে SELECT
একটি XLOCK
ইঙ্গিত সহ একটি সম্পাদন করে আপনি এটি চেষ্টা করতে পারেন । অবিচ্ছিন্ন সূচকের বর্তমান মানটি কী তা নির্ধারণের জন্য, বাস্তবায়নের পরিকল্পনাটি সঠিকভাবে পাওয়া এবং এই অতিরিক্ত লকটি নেওয়ার সমস্ত পার্শ্ব প্রতিক্রিয়া সঠিকভাবে প্রত্যাশা করে তা আপনার উপর নির্ভর করে। এটি লকিং ইঞ্জিনটিকে অপ্রয়োজনীয় বলে মনে করা হলে লকটি এড়াতে পর্যাপ্ত স্মার্ট না হওয়ার উপরও নির্ভর করে ।
সংক্ষেপে, যদিও এটি নীতিগতভাবে সম্ভব, আমি এটির প্রস্তাব দিই না। কোনও কিছু মিস করা বা সৃজনশীল উপায়ে নিজেকে ছড়িয়ে দেওয়া খুব সহজ। আপনার যদি সত্যিই এই অচলাবস্থাগুলি এড়াতে হবে (কেবল সেগুলি সনাক্তকরণ এবং পুনরায় চেষ্টা করার চেয়ে), আমি আপনাকে উপরে উল্লিখিত আরও সাধারণ সমাধানগুলি দেখার পরিবর্তে উত্সাহিত করব।