ট্যাবলোক ইঙ্গিত ডেডলকগুলি ট্রিগার করে


10

আমি দুটি ডেটা সেট সন্নিবেশ করছিলাম, ন্যূনতম লগিং ব্যবহার করে, খালি হিপ টেবিলটিতে দুটি এক্সিকিউট এসকিউএল টাস্কের মাধ্যমে সমান্তরালভাবে এবং নিম্নলিখিত ফর্মের এসকিউএল সহ চলমান।

INSERT INTO Table (TABLOCK) SELECT FROM ...

কাজটি কিছুটা স্তব্ধ হয়ে যাওয়ার পরে, এসকিউএল-এর একটি কার্য অচল হয়ে পড়েছিল dead নীচে ডেডলক গ্রাফের এক্সএমএল আউটপুট রয়েছে।

হুডের নীচে কী ঘটছে তা কেউ ব্যাখ্যা করতে পারেন?

  <resource-list>
   <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
    <owner-list>
     <owner id="process9609dc8" mode="Sch-S"/>
     <owner id="process9609dc8" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process5e13048" mode="X" requestType="convert"/>
    </waiter-list>
   </objectlock>
   <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746">
    <owner-list>
     <owner id="process5e13048" mode="Sch-S"/>
     <owner id="process5e13048" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process9609dc8" mode="X" requestType="convert"/>
    </waiter-list>
   </objectlock>
  </resource-list>

জিনিসগুলি অনেক কৌশলযুক্ত হয় কারণ আমি দেখেছি বেশিরভাগ ক্ষেত্রে দুটি কার্যকর এসকিউএল কার্য সফলভাবে সমান্তরালে চলতে পারে। নীচে চেষ্টা করুন:

Create table dbo.TablockInsert (c1 int, c2 int, c3 int)

--then issue the script in two Execute Sql Task in parallel you won't fail:
insert into dbo.TablockInsert(TABLOCK) SELECT 1, 1, 1

যেহেতু পার্থক্য কেবলমাত্র নির্বাচন ... FROM ... বিবৃতি, নির্বাচন থেকে নির্বাচন করুন ... FROM ... বিবৃতি এখানে লক মোডে প্রভাব ফেলতে পারে?


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

উত্তর:


8

ডেটা লোড পারফরমেন্স গাইড এসকিউএল সার্ভার 2008 জন্য লিখিত হয় কিন্তু যতদূর আমি বলতে পারি মাইক্রোসফট গাদা জন্য এই এলাকায় কোনো উন্নয়ন সাধন করেননি। আপনার লোডিং দৃশ্যের জন্য এখানে একটি উদ্ধৃতি দেওয়া হয়েছে:

বাল্ক একটি খালি, নিরবিচ্ছিন্ন সারণী লোড হচ্ছে

একটি অ-বিভাগীয় টেবিলের মধ্যে ডেটা লোড করা, যখন একটি সাধারণ অপারেশন, বিভিন্ন উপায়ে অনুকূলিত করা যায়।

...

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

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

গুরুত্বপূর্ণ অংশটি হ'ল আপনি কোনও BU লকটি পাবেন না INSERT ... SELECT। আপনি সর্বদা টেবিলে একটি এক্সক্লুসিভ লক পাবেন, তাই INSERTএকবারে কেবলমাত্র একজন চালাতে পারেন।

মন্তব্যে আপনি বলেছিলেন যে আপনি 100k সারি বা তারও কম সন্নিবেশ করিয়ে দেবেন এবং সন্নিবেশকালে অন্য প্রক্রিয়াগুলি টেবিলগুলিতে চলবে না। ডাটাবেসে দুটি INSERT ক্যোয়ারী প্রেরণ করার সময় আমি তিনটি জিনিসের মধ্যে একটির ঘটবে বলে আশা করব:

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

সমস্ত ক্ষেত্রে আপনার হয় উপকার হয় বা কোয়েরিতে কোনও TABLOCKXইঙ্গিত যোগ করে আঘাত করা হয় না , তাই অচলাবস্থার চারপাশে কাজ করার আমার পরামর্শ my আপনি যদি জানতে চান যে অচলাবস্থায় কখনও কখনও কেন ঘটে থাকে তবে আপনাকে এর জন্য অন্য একটি উত্তর সন্ধান করতে হবে।

একটি ভিন্ন দৃশ্যের জন্য যেখানে আপনার সত্যিই সমান্তরাল সন্নিবেশ প্রয়োজন, বিইউ ইস্যুটির চারপাশে কাজ করার দুটি উপায় হ'ল আপনার হিপ বিভাজন করা এবং প্রতিটি সেশনের একটি পৃথক পার্টিশনে sertোকানো বা বিসিপি, বাল্ক ইনসার্ট বা ইন্টিগ্রেশন পরিষেবাদির মাধ্যমে আপনার ডেটা লোড করা to ।


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

@ যে ক্ষেত্রে এটি সম্ভবত ব্যর্থ হয় না তারা আসলে সিরিয়ালি চলতে শুরু করে। একটি নির্দিষ্ট শুরু সময় যেমন পরিকল্পনা সংকলনের জন্য কেবল তখনই আপনি সমস্যাটিকে আঘাত করবেন।
মার্টিন স্মিথ

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

@ টেককনো কিছুই না আপনি কত সারি সন্নিবেশ করেন? প্রক্রিয়াটি প্রতিদিন কতবার চালিত হয়? ডেটা লোড করার সময় কি অন্য প্রশ্নগুলি টেবিল থেকে নির্বাচন করে?
জো ওবিশ 21

@ জোওব্বিশ ১. আমি মনে করি না যে এখানে সারিগুলির # টি ইস্যু হয়েছে, আমাদের কাছে প্রতিটি ক্যোয়ারির জন্য কেবল 4000 - 70000 রয়েছে এবং তারা কিউব ব্যবহারের জন্য অত্যন্ত একত্রিত ডেটা। ২. এটি এখনও পরীক্ষার পর্যায়ে রয়েছে, প্রতিদিন একবার চালানোর কথা। ৩. অন্য কিছুই লক্ষ্য টেবিল থেকে পড়ছে না।
স্ক্যালোহেল

4

আপনি মধ্যে ঢোকাতে হয় dbo.TargetTableদুটি সেশন থেকে এবং উভয় ব্যবহার TABLOCKhint.Both process9609dc8এবং process5e13048প্রক্রিয়া হোল্ডিং Sch-Sএবং IXকেশ যা অপরের সঙ্গে সামঞ্জস্যপূর্ণ, যাতে উভয় প্রক্রিয়া একই সময়ে ধরে রাখতে পারেন। তবে উভয়ই IXলককে Exclusive Xটাইপে রূপান্তর করতে চায় । Xলকগুলি একে অপরের সাথে সামঞ্জস্যপূর্ণ নয়। অতএব, এসকিউএল সার্ভার একে অপরের জন্য অপরিণতভাবে অপেক্ষা না করে সেশনের একটিকে অচলাবস্থার শিকার হিসাবে বেছে নিয়েছিল।

বেসিক ডেডলকিং তথ্য।

লক সামঞ্জস্যতা (ডাটাবেস ইঞ্জিন) চার্ট।

ডেডলকগুলি সনাক্ত করা এবং শেষ হচ্ছে।

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