এক্সলোকের সাথে নির্বাচন করুন ... নির্বাচন করার জন্য ভাল কারণ?


11

আমি কিছু পুনরায় সংঘটিত ডেডলকগুলির মুখোমুখি হচ্ছি যার মধ্যে একটি কীলক এবং এতে এক্সলক ইঙ্গিত সহ একটি নির্বাচন প্রশ্ন রয়েছে যা অচলাবস্থার শিকার হয়ে যায়। অন্য বিবৃতিটি প্রথম সন্ধানের দর্শনের অংশ এমন একটি সারণীর মধ্যে একটি INSERT।

দেখুন:

create view dbo.viewE
 as
    select * from dbo.E  
    where myValue > 13000 

প্রশ্ন নির্বাচন করুন:

select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() 

সংস্থান বিবৃতি:

INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate())

অন্তর্নিহিত টেবিল dbo.E প্রায় 20 টি কলামে প্রায় 3 মিলিয়ন সারি ধারণ করে, এর মধ্যে কয়েকটি নেক্সট।

প্রশ্নগুলি বাইরে নিয়ে যাওয়া এবং দুটি লেনদেনের সাথে এটি ম্যানুয়ালি অনুকরণ করে, আচরণটি পুনরায় উত্পাদনযোগ্য। এক্সলোককে নির্বাচন থেকে সরানো থাকলে আচরণটি পরিবর্তিত হয়।

ডেডলক গ্রাফ:

<deadlock-list>
 <deadlock victim="process222222221">
  <process-list>
   <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" XDES="0x2f1ec5ca0" lockMode="RangeX-X" schedulerid="15" kpid="12936" status="suspended" spid="359" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2015-09-14T16:32:36.160" lastbatchcompleted="2015-09-14T16:32:36.160" clientapp="x" hostname="x" hostpid="14536" loginname="x" isolationlevel="serializable (4)" xactid="27202256401" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="48" sqlhandle="0x02000000611e4523142b2318c47c87313a9b2ba587ff3130">
        SELECT * FROM viewE WITH (XLOCK) WHERE A &lt; GetUtcDate()      </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@UICulture nvarchar(5))SELECT * FROM viewE WITH (XLOCK) WHERE A &lt; GetUtcDate()    </inputbuf>
   </process>
   <process id="process6022222" taskpriority="0" logused="161152" waitresource="KEY: 5:72057604035644444 (cd874c2ba438)" waittime="1370" ownerId="27202248438" transactionguid="0x8de5ccd6eeef67469c6234af59e44ca5" transactionname="DTCXact" lasttranstarted="2015-09-14T16:32:34.767" XDES="0x4aa0bf950" lockMode="RangeI-N" schedulerid="14" kpid="6636" status="suspended" spid="329" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-14T16:32:37.300" lastbatchcompleted="2015-09-14T16:32:37.300" clientapp="x" hostname="x" hostpid="14536" loginname="x" isolationlevel="read uncommitted (1)" xactid="27202248438" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="936" sqlhandle="0x020000004853462f09790a4ddedc0d574c2afa539aef1c0e">
     INSERT INTO [E] ([a], [b], [c],...) VALUES (@aDate, @bDate, @c, ...)
     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>INSERT INTO [E] ([a], [b], [c],...) VALUES (@aDate, @bDate, @c, ...)
    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <keylock hobtid="72057604035644444" dbid="5" objectname="db.dbo.E" indexname="IX_index1" id="lock258b6dc80" mode="X" associatedObjectId="72057604035644444">
    <owner-list>
     <owner id="process6022222" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process222222221" mode="RangeX-X" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057604035644444" dbid="5" objectname="db.dbo.E" indexname="IX_index1" id="lock7b145c400" mode="RangeX-X" associatedObjectId="72057604035644444">
    <owner-list>
     <owner id="process222222221" mode="RangeX-X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process6022222" mode="RangeI-N" requestType="wait"/>
    </waiter-list>
   </keylock>
  </resource-list>
 </deadlock>
</deadlock-list>

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

আমার প্রশ্নগুলো:

  1. জড়িত প্রয়োজনীয় NTEXT কলামের কারণে আমি একটি প্রচ্ছদ সূচক তৈরি করতে পারি না। এখানে কীভাবে সারির সংখ্যা হ্রাস করতে সহায়তা করবে?
  2. এক্সক্লক দিয়ে সিলেক্টটি কার্যকর করা হয়েছে তা আমি জানি না এমন কোনও কারণ আছে? এক্সলক ছাড়া অচলাবস্থা কি ঘটবে?

উত্তর:


15

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

মূলত, হ্যাঁ পঠন অপারেশন (নির্বাচন করুন) প্রথমে অবিচ্ছিন্ন সূচকে অ্যাক্সেস করে, তারপরে ক্লাস্টারড ইনডেক্স (লুকআপ)। রাইটিং অপারেশন (সন্নিবেশ) প্রথমে ক্লাস্টারড সূচকটি অ্যাক্সেস করে, তবে অবিচ্ছিন্ন সূচক। অসম্পূর্ণ লকগুলি ধারণ করে আলাদা অর্ডারে একই সংস্থানগুলিতে অ্যাক্সেস অচলাবস্থার দিকে নিয়ে যেতে পারে।

এখানে কীভাবে সারির সংখ্যা হ্রাস করতে সহায়তা করবে?

এটি হতে পারে , কারণ কম সংস্থানগুলি লক হয়ে গেছে এবং অপারেশনটি আরও দ্রুত সম্পন্ন করার ঝোঁক করবে। যদি এটি সহায়তা করে তবে এটি অচলাবস্থা হ্রাস করতে পারে তবে সম্ভবত এগুলি সরিয়ে দেয় না (তবে পড়ুন)।

এক্সক্লক দিয়ে সিলেক্টটি কার্যকর করা হয়েছে তা আমি জানি না এমন কোনও কারণ আছে?

আসলে তা না. এই সমস্যাটি কমাতে বা নির্মূল করার মরিয়া প্রয়াসে বিচ্ছিন্নতা, লকিং এবং ডেডলকগুলি কীভাবে কাজ করে সে সম্পর্কে সম্পূর্ণ ধারণা ছাড়াই এই জাতীয় লক ইঙ্গিতগুলি প্রায়শই লোকেরা প্রবর্তন করে।

এক্সলক ছাড়া অচলাবস্থা কি ঘটবে?

না , যদি নির্বাচিতগুলি বাস্তবে পঠিত বিচ্ছিন্নতা থেকে চালিত হয় কারণ বেমানান লকগুলি পৃথক ক্রমে নেওয়া হবে না (এবং ধরে রাখা হবে)।

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

পরামর্শ

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

সিরিয়ালাইজেবলের এই বৃদ্ধি ছাড়াই, সম্ভাবনা খুব ভাল যে এই অচলাবস্থাটি ঘটবে না, ধরে নিয়েই XLOCKইঙ্গিতটি সরানো হয়েছে। এটি বলেছিল, আপনি পড়া নিরবিচ্ছিন্ন বিচ্ছিন্নতার অধীনে পড়বেন , যা খুব কম সামঞ্জস্যতার গ্যারান্টি সহ আসে।

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

পরিশেষে, XLOCKইঙ্গিতটি হয় পাল্টা উত্পাদনশীল, কিন্তু আপনি সত্যিই serializable বিচ্ছিন্নতা স্তর ব্যবহারের জন্য কারণ দেখব করা প্রয়োজন। trancount = 2এছাড়াও আকর্ষণীয় - সম্ভবত আপনি অনিচ্ছাকৃতভাবে পাখির লেনদেন এখানে আছে। অন্য কিছু যাচাই করার জন্য।


2
  1. সারিগুলির সংখ্যা হ্রাস করে অচলাবস্থার সম্ভাবনা হ্রাস করবে, তবে এটি সম্পূর্ণরূপে সরে যাবে না।

সরল ভাষায় নির্বাচনটি প্রথমে সূচকগুলি নির্বাচন করতে সারণি নির্ধারণ করতে ব্যবহার করে, তারপরে সারিগুলি আনছে, যখন সন্নিবেশ সারি সন্নিবেশ করছে, তারপরে (এক্সলোকড) সূচকটি আপডেট করার চেষ্টা করছে।

  1. অ্যাপ্লিকেশন বিকাশকারীরা একই লেনদেনের পরে যদি ডেটাতে একটি আপডেট করতে চান তবে এক্সলোক ব্যবহার করতে ঝোঁক। এটি নিশ্চিত করে যে তাদের অধীনে কেউ ডেটা আপডেট করতে পারবেন না। এক্সলোক প্রয়োজন কিনা তা দেখতে অ্যাপ্লিকেশনটি কী করছে তা আমি তদন্ত করব।

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

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

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