এসকিউএল সার্ভার সূচক আপডেট ডেডলক


13

আমার 2 টি ক্যোয়ারী রয়েছে যা একই সাথে চালালে অচলাবস্থার সৃষ্টি হয়।

প্রশ্ন 1 - একটি সূচক (সূচি 1) এর অন্তর্ভুক্ত একটি কলাম আপডেট করুন:

update table1 set column1 = value1 where id = @Id

টেবিল 1 এ এক্স-লক নেয় তারপর সূচক 1 এ এক্স-লক চেষ্টা করে।

প্রশ্ন 2:

select columnx, columny, etc from table1 where {some condition}

ইনডেক্স 1 এ একটি এস-লক নেয় তারপর টেবিল 1 এ একটি এস-লক চেষ্টা করে।

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

বিচ্ছিন্নতা স্তর পড়ুন প্রতিশ্রুতিবদ্ধ। সূচির জন্য সারি এবং পৃষ্ঠা লকগুলি সক্ষম করা হয়েছে। এটা সম্ভব যে একই রেকর্ড উভয় প্রশ্নের সাথে অংশ নিচ্ছে - আমি পরামিতিগুলি না দেখায় ডেডলক গ্রাফটি থেকে বলতে পারি না।

ডেডলক গ্রাফ

উত্তর:


11

একই প্রশ্নগুলি বজায় রেখে অচলাবস্থা রোধ করার কোনও উপায় আছে কি?

অচলাবস্থা গ্রাফটি দেখায় যে এই নির্দিষ্ট অচলাবস্থাটি একটি বুকমার্ক লুকের সাথে সম্পর্কিত একটি রূপান্তর অচলতা ছিল (এই ক্ষেত্রে একটি আরআইডি লুকোচুরি):

ডেডলক গ্রাফ

প্রশ্ন নোট হিসাবে, সাধারণ অচলাবস্থা ঝুঁকি দেখা দেয় কারণ প্রশ্নগুলি বিভিন্ন ক্রমে একই সংস্থানগুলিতে অসম্পূর্ণ লকগুলি পেতে পারে। SELECTক্যোয়ারী, পরিত্রাণ লুকআপ কারণে টেবিল সামনে সূচক অ্যাক্সেস করতে যেহেতু প্রয়োজন UPDATEসূচক ক্যোয়ারী মডিফাই টেবিল প্রথম, তারপর।

অচলাবস্থা দূর করতে ডেডলক উপাদানগুলির একটি অপসারণ করা দরকার। নিম্নলিখিত প্রধান বিকল্পগুলি:

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

টেবিল এবং সূচী অ্যাক্সেস একই ক্রমে রয়েছে তা নিশ্চিত করার জন্য আপডেটের আগে আপডেটের লেনদেনে সূচিতে আমি কোনওভাবে এক্স-লক নিতে পারি?

আপনি একটি সুস্পষ্ট লেনদেনে আপডেটটি মুড়ে এবং আপডেটের আগে নন-ক্ল্লাস্টার্ড সূচক মানটিতে SELECTএকটি XLOCKইঙ্গিত সহ একটি সম্পাদন করে আপনি এটি চেষ্টা করতে পারেন । অবিচ্ছিন্ন সূচকের বর্তমান মানটি কী তা নির্ধারণের জন্য, বাস্তবায়নের পরিকল্পনাটি সঠিকভাবে পাওয়া এবং এই অতিরিক্ত লকটি নেওয়ার সমস্ত পার্শ্ব প্রতিক্রিয়া সঠিকভাবে প্রত্যাশা করে তা আপনার উপর নির্ভর করে। এটি লকিং ইঞ্জিনটিকে অপ্রয়োজনীয় বলে মনে করা হলে লকটি এড়াতে পর্যাপ্ত স্মার্ট না হওয়ার উপরও নির্ভর করে ।

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


ইস্যুটির দিকে আরও নজর দেওয়া থেকে আমি মনে করি এটি অপরিবর্তিত রেখে যাওয়া সম্ভবত সেরা। এটি একটি আরও সাধারণ সমস্যা যা আমি মূলত বুঝতে পেরেছিলাম।
ডেল কে

1

আমার একটি একই সমস্যা রয়েছে যা মাঝেমধ্যে ঘটে এবং আমি যে পদ্ধতি গ্রহণ করি তা এখানে।

  1. যোগ set deadlock priority low;নির্বাচন করুন। যখন কোনও অচলাবস্থা দেখা দেয় তখন এটি এই ক্যোয়ারিকে অচলাবস্থার শিকার হতে পারে।
  2. আপনার অ্যাপ্লিকেশনের মধ্যে পুনরায় চেষ্টা করুন যুক্তিটি অচলভাবে জিজ্ঞাসাগুলি সম্পূর্ণরূপে অনুমতি দেওয়ার জন্য অল্প সময়ের জন্য অপেক্ষা / ঘুমানোর পরে যদি অচল হয়ে যাওয়ার কারণে (বা টাইমআউট) কারণে ব্যর্থ হয় তবে স্বয়ংক্রিয়ভাবে নির্বাচনের পুনরায় চেষ্টা করুন।

দ্রষ্টব্য: যদি আপনি selectএকটি সুস্পষ্ট মাল্টি-স্টেটমেন্ট লেনদেনের অংশ হন, তবে আপনাকে পুরো লেনদেনের পুনরায় চেষ্টা করতে হবে এবং কেবলমাত্র ব্যর্থ হয়েছে যে বিবৃতিটি নয়, তবে আপনি কিছু অপ্রত্যাশিত ফলাফল পেতে পারেন। যদি এটি একক হয় selectতবে আপনি ভাল আছেন, তবে এটি যদি কোনও লেনদেনের মধ্যে বিবৃতি xহয় nতবে কেবল পুনরায় চেষ্টা করার nসময় আপনি সমস্ত বিবৃতি পুনরায় চেষ্টা করবেন তা নিশ্চিত করুন ।


ধন্যবাদ - প্রশ্নগুলি ডিফল্টরূপে স্বয়ংক্রিয়ভাবে ডেডলক আক্রান্ত হয়। এবং হ্যাঁ আমরা ইতিমধ্যে জায়গায় একটি শক্তিশালী পুনরায় চেষ্টা করার ব্যবস্থা আছে।
ডেল কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.