5.1 যুগপৎ সমস্যা

একটু দূরের তত্ত্ব দিয়ে শুরু করা যাক।

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

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

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

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

যখন কিছু প্রক্রিয়া ডাটাবেসের কাছে অনুরোধ করে, তখন এটি একটি নির্দিষ্ট অবস্থায় খুঁজে পায়। একটি রাষ্ট্রীয় ব্যবস্থা এমন একটি সিস্টেম যা পূর্ববর্তী ঘটনাগুলি মনে রাখে এবং কিছু তথ্য সংরক্ষণ করে, যাকে "রাষ্ট্র" বলা হয়। ঘোষিত একটি ভেরিয়েবলের integer0, 1, 2 বা 42 এর অবস্থা থাকতে পারে। Mutex (পারস্পরিক বর্জন) এর দুটি অবস্থা আছে: লক বা আনলক করা , ঠিক যেমন একটি বাইনারি সেমাফোর ("প্রয়োজনীয়" বনাম "মুক্তি") এবং সাধারণত বাইনারি (বাইনারী) ডাটা টাইপ এবং ভেরিয়েবল যার মাত্র দুটি স্টেট থাকতে পারে - 1 বা 0।

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

সুতরাং, মেশিন জগতের বেশিরভাগ বস্তুর এমন কিছু অবস্থা আছে যা সময়ের সাথে সাথে পরিবর্তিত হতে পারে: আমাদের পাইপলাইন, যা একটি বড় ডেটা প্যাকেট প্রক্রিয়া করে, একটি ত্রুটি ছুড়ে ফেলে এবং ব্যর্থ হয়, বা Wallet অবজেক্টের সম্পত্তি, যা ব্যবহারকারীর অবশিষ্ট অর্থ সংরক্ষণ করে অ্যাকাউন্ট, বেতন প্রাপ্তির পরে পরিবর্তন।

একটি ট্রানজিশন ("ট্রানজিশন") এক স্টেট থেকে অন্য স্টেটে-বলুন, প্রগতি থেকে ব্যর্থ হওয়া -কে অপারেশন বলা হয়। সম্ভবত, সবাই CRUD অপারেশনগুলি জানে - create, read, update, deleteবা অনুরূপ HTTP পদ্ধতিগুলি - POST, GET, PUT, DELETE. কিন্তু প্রোগ্রামাররা প্রায়ই তাদের কোডে ক্রিয়াকলাপের অন্যান্য নাম দেয়, কারণ অপারেশনটি ডাটাবেস থেকে একটি নির্দিষ্ট মান পড়ার চেয়ে আরও জটিল হতে পারে - এটি ডেটাও পরীক্ষা করতে পারে এবং তারপরে আমাদের অপারেশন, যা একটি ফাংশনের রূপ নিয়েছে, বলা হবে, উদাহরণস্বরূপ, এবং validate()কে এই অপারেশন-ফাংশন সঞ্চালন? প্রক্রিয়া ইতিমধ্যে বর্ণিত।

একটু বেশি, এবং আপনি বুঝতে পারবেন কেন আমি এত বিস্তারিতভাবে শর্তাবলী বর্ণনা করছি!

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

আমাদের করণীয় তালিকার অ্যাপ্লিকেশনটি কল্পনা করা যাক। আপনি মোবাইল ইন্টারফেসের মাধ্যমে ডাটাবেসের কাছে একটি অনুরোধ করেন 14:00:00.014, এবং আপনার মা 13:59:59.678(অর্থাৎ, 336 মিলিসেকেন্ড আগে) একই ইন্টারফেসের মাধ্যমে করণীয় তালিকা আপডেট করেছেন, এতে বাসন ধোয়ার জিনিস যোগ করেছেন। নেটওয়ার্ক বিলম্ব এবং আপনার ডাটাবেসের সম্ভাব্য সারির কাজগুলি বিবেচনায় নিয়ে, যদি আপনি এবং আপনার মা ছাড়াও, আপনার মায়ের সমস্ত বন্ধুরাও আপনার অ্যাপ্লিকেশনটি ব্যবহার করে, ডাটাবেসটি আপনার প্রক্রিয়া করার পরে মায়ের অনুরোধটি কার্যকর করতে পারে। অন্য কথায়, আপনার দুটি অনুরোধ, সেইসাথে আপনার মায়ের বান্ধবীদের কাছ থেকে অনুরোধগুলি একই সময়ে (একসঙ্গে) একই ডেটাতে পাঠানোর সম্ভাবনা রয়েছে।

তাই আমরা ডাটাবেস এবং বিতরণ করা অ্যাপ্লিকেশনের ক্ষেত্রে সবচেয়ে গুরুত্বপূর্ণ পদে এসেছি - একযোগে। দুটি অপারেশনের একযোগে ঠিক কী বোঝাতে পারে? যদি কিছু অপারেশন T1 এবং কিছু অপারেশন T2 দেওয়া হয়, তাহলে:

  • T1 কার্যকর করা T2 শুরুর সময়ের আগে শুরু করা যেতে পারে এবং T2 এর শুরু এবং শেষ সময়ের মধ্যে শেষ করা যেতে পারে
  • T2 টি 1 এর শুরুর সময়ের আগে শুরু করা যেতে পারে এবং T1 এর শুরু এবং শেষের মধ্যে শেষ করা যেতে পারে
  • T1 শুরু এবং T1 সম্পাদনের শুরু এবং শেষ সময়ের মধ্যে শেষ করা যেতে পারে
  • এবং অন্য কোনো দৃশ্য যেখানে T1 এবং T2 এর কিছু সাধারণ এক্সিকিউশন সময় আছে

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

এবং কি, আসলে, ভুল হতে পারে, বিশুদ্ধভাবে তাত্ত্বিকভাবে?

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

5.2 লেনদেন আমাদের বাঁচাতে এসেছে

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

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

এই সমস্যাটি সমাধান করার জন্য, "বিচ্ছিন্নতা" এর মতো একটি লেনদেনের সম্পত্তির আহ্বান জানানো হয়েছিল: আমাদের লেনদেনটি এমনভাবে সম্পাদিত হয় যেন একই মুহূর্তে অন্য কোনও লেনদেন করা হচ্ছে না। আমাদের ডাটাবেস সমসাময়িক ক্রিয়াকলাপগুলি সম্পাদন করে যেন এটি সেগুলিকে একের পর এক সম্পাদন করছে, ক্রমানুসারে - প্রকৃতপক্ষে, সর্বোচ্চ বিচ্ছিন্নতা স্তরকে বলা হয় কঠোর সিরিয়ালাইজেবল । হ্যাঁ, সর্বোচ্চ, যার মানে বেশ কয়েকটি স্তর রয়েছে।

"থাম," আপনি বলুন। আপনার ঘোড়া ধরুন, স্যার.

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

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

বিভিন্ন সম্ভাব্য অসঙ্গতি আছে। অর্থাৎ, অসঙ্গতিগুলি হল এক ধরণের অবাঞ্ছিত ডেটা অবস্থা যা ডেটাবেসে প্রতিযোগিতামূলক অ্যাক্সেসের সময় ঘটতে পারে। এবং নির্দিষ্ট কিছু অবাঞ্ছিত অবস্থা এড়াতে, ডেটাবেসগুলি বিভিন্ন স্তরের বিচ্ছিন্নতা ব্যবহার করে - অর্থাৎ, অবাঞ্ছিত অবস্থা থেকে ডেটা সুরক্ষার বিভিন্ন স্তর। এই স্তরগুলি (4 টুকরা) ANSI SQL-92 স্ট্যান্ডার্ডে তালিকাভুক্ত করা হয়েছিল।

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

-- Database: MySQL

-- Setup before test
create table test (id int primary key, value int) engine=innodb;
insert into test (id, value) values (1, 10), (2, 20);

-- Test the "read uncommited" isolation level on the "Intermediate Reads" (G1b) anomaly
set session transaction isolation level read uncommitted; begin; -- T1
set session transaction isolation level read uncommitted; begin; -- T2
update test set value = 101 where id = 1; -- T1
select * from test; -- T2. Shows 1 => 101
update test set value = 11 where id = 1; -- T1
commit; -- T1
select * from test; -- T2. Now shows 1 => 11
commit; -- T2

-- Result: doesn't prevent G1b

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

5.3 "I" এবং ACID-তে অন্যান্য অক্ষর

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

ব্যাঙ্ক ট্রান্সফারের সাথে আমাদের উদাহরণ আবার স্মরণ করুন। একটি অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে তহবিল স্থানান্তর করার জন্য একটি লেনদেনের মধ্যে রয়েছে প্রথম অ্যাকাউন্ট থেকে একটি উত্তোলন অপারেশন এবং দ্বিতীয়টিতে একটি পুনঃপূরণ অপারেশন। দ্বিতীয় অ্যাকাউন্টের পুনঃপূরণ অপারেশন ব্যর্থ হলে, আপনি সম্ভবত প্রথম অ্যাকাউন্ট থেকে প্রত্যাহার অপারেশন ঘটতে চান না। অন্য কথায়, হয় লেনদেন সম্পূর্ণরূপে সফল হয়, বা এটি মোটেও ঘটে না, তবে এটি শুধুমাত্র কিছু অংশের জন্য করা যায় না। এই বৈশিষ্ট্যটিকে "পরমাণু" বলা হয় এবং এটি ACID-তে একটি "A"।

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

এই গ্যারান্টিটিকে "সংগতি" বলা হয় এবং এসিআইডি-তে একটি চিঠি C(বিতরণ করা অ্যাপ্লিকেশনের বিশ্ব থেকে ধারাবাহিকতার সাথে বিভ্রান্ত না হওয়া, যা আমরা পরে কথা বলব)। আমি এসিআইডি অর্থে ধারাবাহিকতার জন্য একটি স্পষ্ট উদাহরণ দেব: একটি অনলাইন স্টোরের জন্য একটি অ্যাপ্লিকেশন ordersটেবিলে একটি সারি যুক্ত করতে চায় এবং টেবিল থেকে আইডিটিproduct_id কলামে নির্দেশিত হবে - সাধারণত ।productsforeign key

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

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

HTTP 200ঠিক অন্য দিন, আমি AWS (Amazon Web Services) থেকে DynamoDB এর সাথে কাজ করছিলাম এবং কিছু ডেটা সেভ করার জন্য পাঠিয়েছিলাম, এবং একটি উত্তর (ঠিক আছে), বা এরকম কিছু পাওয়ার পরে, আমি এটি পরীক্ষা করার সিদ্ধান্ত নিয়েছিলাম - এবং এটি দেখতে পাইনি পরবর্তী 10 সেকেন্ডের জন্য ডাটাবেসে ডেটা। অর্থাৎ, DynamoDB আমার ডেটা প্রতিশ্রুতিবদ্ধ করেছে, কিন্তু সমস্ত নোড তাত্ক্ষণিকভাবে ডেটার সর্বশেষ অনুলিপি পেতে সিঙ্ক্রোনাইজ করে না (যদিও এটি ক্যাশে থাকতে পারে)। এখানে আমরা আবার বিতরণ ব্যবস্থার প্রেক্ষাপটে সামঞ্জস্যের অঞ্চলে আরোহণ করেছি, তবে এটি সম্পর্কে কথা বলার সময় এখনও আসেনি।

তাই এখন আমরা জানি ACID গ্যারান্টি কি। এবং আমরা এমনকি জানি কেন তারা দরকারী। কিন্তু আমাদের কি সত্যিই প্রতিটি অ্যাপ্লিকেশনে তাদের প্রয়োজন? এবং যদি না হয়, ঠিক কখন? সমস্ত ডিবি কি এই গ্যারান্টিগুলি অফার করে এবং যদি না করে, তবে তারা পরিবর্তে কী অফার করে?