InnoDB এটি করার আগে লেনদেনের ডেটা কোথায় সঞ্চয় করে?


12

আমি জেডিবিসি প্রযুক্তি ব্যবহার করে READ_COMMITTEDএবং READ_UNCOMMITTEDবাড়িতে কিছু পরীক্ষা করেছি ।

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

প্রশ্নাবলি

  • যেখানে অননুমোদিত ডেটা সংরক্ষণ করা হয়, যেমন READ_UNCOMMITTEDকোনও লেনদেন অন্য লেনদেন থেকে অনিয়মিত ডেটা পড়তে পারে?
  • কেন কোনও READ_COMMITTEDলেনদেনের জন্য আপোষহীন ডেটা পড়া, অর্থাৎ "নোংরা পাঠ" সম্পাদন করা সম্ভব হচ্ছে না ? এই বিধিনিষেধটি কার্যকর করার জন্য কোন পদ্ধতি?

উত্তর:


11

" অনির্দিষ্ট ডেটা কোথায় সংরক্ষণ করা হয়, যেমন একটি READ_UNCOMMITTED লেনদেন অন্য লেনদেন থেকে অনিয়মিত ডেটা পড়তে পারে? "

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

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

আশা করি তা বোধগম্য হয়? :)

এফওয়াইআই হিসাবে, মাইএসকিউএল ৫.7-তে আপনি ইউএনডিও টেবিলস্পেস এবং লগগুলি সিস্টেম টেবিল স্পেসের বাইরে নিয়ে যেতে পারেন এবং সেগুলি স্বয়ংক্রিয়ভাবে কেটে ফেলাতে পারেন। আপনার যদি দীর্ঘকাল ধরে চলমান লেনদেন থাকে যা খাঁটি অপারেশনকে বাধা দেয়, ফলশ্রুতিতে খুব দীর্ঘ এবং বর্ধমান ইতিহাস তালিকার দৈর্ঘ্য হতে পারে তবে এগুলি বেশ বড় হতে পারে। সিস্টেমে টেবিল স্পেসে এগুলি সংরক্ষণ করা একটি বিশাল / ক্রমবর্ধমান ইবদাটা ১ ফাইলের একক সাধারণ কারণ ছিল, যা পরে সেই স্থানটি পুনরায় দাবি করার জন্য কাটা / সঙ্কুচিত / শূন্য করা যায় না।


4

তুমি জিজ্ঞেস করেছিলে

যেখানে অননুমোদিত ডেটা সংরক্ষণ করা হয়, যেমন একটি READ_UNCOMMITTED লেনদেন অন্য লেনদেন থেকে অনির্দিষ্ট ডেটা পড়তে পারে?

আপনার প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে ইনোডিবি আর্কিটেকচারটি কেমন দেখাচ্ছে তা জানতে হবে।

নিম্নলিখিত ছবিটি কয়েক বছর আগে পেরকোনা সিটিও ভাদিম তাকাচেনকো তৈরি করেছিলেন

InnoDB আর্কিটেকচার

ইনোডিবি লেনদেনের মডেল এবং লকিংয়ের উপর মাইএসকিউএল ডকুমেন্টেশন অনুসারে

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

যেহেতু কমিটি এবং রোলব্যাক ডেটা দৃশ্যমানতা পরিচালনা করে, পুনর্নিযুক্ত সংস্থাগুলি পড়ুন এবং অনুমোদন পড়ুন এমন স্ট্রাকচার এবং প্রক্রিয়াগুলির উপর নির্ভর করতে হবে যা পরিবর্তনগুলি রেকর্ড করে

  1. রোলব্যাক অংশগুলি / স্থান পূর্বাবস্থায় ফেরান
  2. লগগুলি আবার করুন
  3. জড়িত টেবিল (গুলি) এর বিরুদ্ধে ল্যাপস লক করুন

রোলব্যাক সেগমেন্টস এবং পূর্বাবস্থায় স্থান পূর্বে পরিবর্তনগুলি প্রয়োগ হওয়ার আগে কীভাবে পরিবর্তিত ডেটা দেখতে হবে তা জানতে পারে। পুনরায় লগগুলি জানত যে ডেটা আপডেট হওয়ার জন্য কী পরিবর্তনগুলি রোল করতে হবে।

আপনিও জিজ্ঞাসা করেছিলেন

কেন READ_COMMITTED লেনদেনের জন্য আপত্তিহীন ডেটা পড়া, অর্থাৎ "নোংরা পড়া" করা সম্ভব হচ্ছে না? এই বিধিনিষেধ কার্যকর করার জন্য কোন পদ্ধতি?

রিডো লগস, পূর্বাবস্থায় ফেরানো স্থান এবং লক করা সারিগুলি কার্যকর হয়। আপনাকে অবশ্যই তিনি ইনোডিবি বাফার পুল বিবেচনা করতে হবে (যেখানে আপনি ইনোডাব_ম্যাক্স_ডার্টি_পেজ_সামগ্রী , ইনডোডব_বাফলার_পুল_পৃষ্ঠাবলি_ডাটি এবং ইনানোডব_বাফলার_পুল_বাইটিস_ডার্টি সহ নোংরা পৃষ্ঠাগুলি পরিমাপ করতে পারবেন )।

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

আইসোলেশন পরিচালনা করতে সারিগুলির লকিংয়ের সম্পূর্ণ বোঝার জন্য, দয়া করে InnoDB লেনদেন মডেল এবং লকিং পড়ুন


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