এমএস এসকিউএল সার্ভারে নেটওয়ার্কের বিলম্বতার কারণে টেবিলের লকগুলি বাড়বে?


16

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

এছাড়াও, প্রতিক্রিয়া আকারের উপর ভিত্তি করে উত্তর পৃথক হবে? এটি কেবল কয়েক কেবি বনাম কয়েকশ এমবি ফিরে আসতে হলে, এটি কোনও পার্থক্য করবে?

সুস্পষ্ট লেনদেন তৈরি করা, অনুসন্ধান চালানো এবং লেনদেন বন্ধ করা স্পষ্টতই টেবিলগুলিকে লক করে দেবে, যেহেতু লেনদেনের সময়কাল আমার বিলম্বের সাথে সম্পর্কিত lated


আপনি যদি কোনও nolockইঙ্গিত নির্দিষ্ট না করেন তবে সর্বদা একটি লক থাকবে । বিলম্বটি কেবলমাত্র কতক্ষণ লকটি অনুষ্ঠিত হবে তা নির্ধারণ করে।
ব্র্যান্ডন


@ ব্রান্ডন কোথাও মাইক্রোসফ্ট দ্বারা নথিভুক্ত আছে? আমার অনুসন্ধানগুলি খালি পরিণত হয়েছে।
ইভান এম

1
@ ব্র্যান্ডন নোলক এর অর্থ এটির অর্থ নয় যা আপনি মনে করেন।
অ্যারন বারট্র্যান্ড

3
@ ব্র্যান্ডন Unless you specify a nolock hint, there will always be a lock.<- এর দ্বারা বোঝা যাচ্ছে আপনি যদি নলক ব্যবহার করেন তবে লকগুলি নাও থাকতে পারে। আমি কেবল স্পষ্ট করে বলছিলাম।
অ্যারন বারট্র্যান্ড

উত্তর:


15

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

এটি সঠিক নয়, এটি বিচ্ছিন্নতা স্তরের উপর নির্ভরশীল।

ডিফল্ট READ COMMITTEDলকগুলিতে বিবৃতি কার্যকর করার সময়কালের জন্য রাখা হয় না। READ COMMITTEDবিবৃতি স্তরের পঠন ধারাবাহিকতা সরবরাহ করে না, একমাত্র গ্যারান্টি হ'ল আপনি অনির্বাচিত ডেটা পড়তে পারবেন না। একটি ভাগ করা লক অধিগ্রহণ করা হয় এবং সারিটি পড়ার জন্য রাখা হয় এবং তারপরে ছেড়ে দেওয়া হয়।

যদি না আপনার LOB প্রকার থাকে।

এলওবি ধরণের, সম্ভাব্যভাবে খুব বড় হওয়ার কারণে এটি বাফার করা যায় না। মূলত আপনাকে REPEATABLE READআচরণ প্রদানের মাধ্যমে স্টেটমেন্ট সম্পূর্ণ না হওয়া পর্যন্ত একটি ভাগ করা লক অবশ্যই অর্জন করতে হবে এবং ধরে রাখতে হবে READ COMMITTED

যদি আমি একটি উচ্চ-বিলম্বিত নেটওয়ার্কের মাধ্যমে কোনও এমএসএসকিউএল ডাটাবেসে একটি কল করে থাকি, তবে এই লেটেন্সিটির কারণে টেবিলের লকগুলি ঘটতে পারে?

প্রচ্ছন্নতা টেবিল লক না ঘটায়, না। যাইহোক, যদি কোনও টেবিল লকটি অধিগ্রহণ করা হয় তবে বিলম্বটি এটি দীর্ঘায়িত হতে চলেছে।

আমার ( @ রেমাসুরাসানু ) এর চেয়ে আরও ভাল যিনি এর যান্ত্রিকগুলি জানেন এমন কাউকে উদ্ধৃত করা :

ফলশ্রুতি কার্যকর হওয়ার সাথে সাথে ক্লায়েন্ট প্রোগ্রামে ফিরে আসে returned সারিগুলি 'বুদ্বুদ' হিসাবে এক্সিকিউশন ট্রিটিকে উপরে রাখে, শীর্ষস্থানীয় অপারেটরকে সাধারণত এই সারিগুলি নেটওয়ার্ক বাফারগুলিতে লিখে ক্লায়েন্টকে ফেরত পাঠানো হয়। ফলাফলটি কিছু মধ্যবর্তী স্টোরেজ (মেমরি বা ডিস্ক) এর মধ্যে তৈরি করা হয় না এবং তারপরে ক্লায়েন্টের কাছে ফেরত পাঠানো হয়, পরিবর্তে এটি তৈরি করা হয় যেমন ফেরত পাঠানো হয় (ক্যোয়ারী কার্যকর হয়)। ক্লায়েন্টকে ফলাফল পাঠানো অবশ্যই নেটওয়ার্ক ফ্লো কন্ট্রোল প্রোটোকলের সাপেক্ষে। যদি ক্লায়েন্ট সক্রিয়ভাবে ফলাফল গ্রাস না করে (যেমন, স্কেলডাটাডার রিডারকে কল করে) then প্রশ্ন.[সূত্র]

ফলাফলগুলি এসকিউএল সার্ভার যত তাড়াতাড়ি সরবরাহ করতে পারে তত তাড়াতাড়ি গ্রাস করা হয় না, তা ক্লায়েন্ট বা নেটওয়ার্কের কারণে হোক, আমরা ASYNC_NETWORK_IOঅপেক্ষা করতে থাকি accum পুনরাবৃত্তি করার জন্য, এটি লকগুলি যেগুলি অধিগ্রহণ করা হয়, কেবলমাত্র তাদের ধারণকালের মধ্যে প্রভাবিত করবে না।


9

মার্কের উত্তরটি আমার প্রচুর বিভ্রান্তি দূর করেছে, তবে নেটবালেন্সারকে বিলম্বিত করার জন্য এটি ব্যবহার করার পরে আমি আমার অনুসন্ধানগুলি পোস্ট করতে চেয়েছিলাম।

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

আমি যা পেয়েছি তা এখানে:

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

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


আকর্ষণীয় ফলাফল। এটি কোন ক্লায়েন্ট প্রোগ্রাম / লাইব্রেরি সহ?
জেমস এল

ভাল জিনিস. কোনও সুযোগ আপনি এতে আরও কিছুটা সময় ব্যয় করতে পারেন এবং ফলাফলের আকারটি নির্ধারণ করতে পারেন যা এটি ঘটে?
মার্ক স্টোরি-স্মিথ

@ মার্কস্টোরী-স্মিথ আমি মনে করি না যে আমি একটি সুনির্দিষ্ট মান পেতে পারি এবং এটি মেশিনের দ্বারা নিঃসন্দেহে পৃথক হবে। Vircom.com/security/improve-sql-nic-performance থেকে দেখে মনে হচ্ছে এটি আপনার স্থানীয় এনআইসিতে একটি সেটিংস, এবং আমার ডাটাবেস সার্ভারে থাকা একটি 'অটো' তে সেট হয়েছে
ইভান এম

@ জামেস আমি সবেমাত্র দুটি মেশিনে এসএসএমএস ব্যবহার করেছি
ইভান এম

0

যদি আমি একটি উচ্চ-বিলম্বিত নেটওয়ার্কের মাধ্যমে কোনও এমএসএসকিউএল ডাটাবেসে একটি কল করে থাকি, তবে এই লেটেন্সিটির কারণে টেবিলের লকগুলি ঘটতে পারে?

এসকিউএল সার্ভার দ্বারা যখন কোনও কোয়েরি বরখাস্ত করা হয় এবং ফলাফলটি প্রকাশ করে তখন ফলাফলটি প্রকাশ করে, আউটপুট বাফারে রাখুন এবং ক্লায়েন্টকে প্রেরণ করুন যা ফলাফল আনে আউটপুট বাফার থেকে। এসকিউএল সার্ভার ক্লায়েন্টের কাছ থেকে স্বীকৃতি না পাওয়া পর্যন্ত কোয়েরিতে থাকা লকগুলি প্রকাশ করবে না। যা বাধা দেওয়ার কারণ হতে পারে।

সম্পাদনা: ইভান আপনি এই এমএস সমর্থন নিবন্ধটি উল্লেখ করতে পারেন

বিভাগে 3

কোনও এসপিআইডি দ্বারা ব্লক করা যার যার সাথে সম্পর্কিত ক্লায়েন্ট অ্যাপ্লিকেশন সমস্ত ফলাফল সারি সমাপ্তিতে আনেনি

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


আপনার উত্তরের জন্য ধন্যবাদ শানকি! এটি কোথাও নথিভুক্ত করা হয়েছে কিনা তা আপনি জানতে পেরেছেন?
ইভান এম


5
এটি সঠিক নয়।
মার্ক স্টোরি-স্মিথ

এটি সঠিক বলে মনে হচ্ছে 'অ্যাপ্লিকেশনটি সমস্ত ফলাফল সারি নিয়ে আসে না, অন্য ব্যবহারকারীদের ব্লক করে টেবিলের উপর তালা রেখে দেওয়া যেতে পারে। আপনি যদি এমন কোনও অ্যাপ্লিকেশন ব্যবহার করছেন যা স্বচ্ছতার সাথে সার্ভারে এসকিউএল স্টেটমেন্ট জমা দেয়, তবে অ্যাপ্লিকেশনটিকে অবশ্যই সমস্ত ফলাফল সারি আনতে হবে। যদি এটি না হয় (এবং এটির জন্য এটি কনফিগার করা যায় না) তবে আপনি ব্লকিং সমস্যা সমাধান করতে অক্ষম হতে পারেন। সমস্যা এড়াতে, আপনি খারাপ প্রতিবেদন করা অ্যাপ্লিকেশনগুলিকে রিপোর্টিং বা সিদ্ধান্ত-সমর্থন ডাটাবেসের মধ্যে সীমাবদ্ধ করতে পারেন। ' আমি সাধারণভাবে কথা বলছিলাম। আপনি এখান থেকে support2.microsoft.com/kb/224453
শ্যাঙ্কি

4
@ প্রশস্ত একটি বড় টেবিল তৈরি করুন। SELECT *এটি থেকে READ COMMITTEDএকটি এসএসএমএস সংযোগে, অন্য থেকে লক পর্যবেক্ষণ করে। যে কোনও সময়ে, আপনি কতটি লক ধরে আছেন?
মার্ক স্টোরি-স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.