1.1 ভূমিকা
এবং এখন মজা শুরু হয় - লেনদেন কিভাবে কাজ করে তার তত্ত্ব। আপনি যখন বিভিন্ন থ্রেডে একই ডেটা পরিবর্তন করেন তখন কীভাবে সিস্টেমটি কাজ করবে? অথবা আপনি কি অন্য একটি লেনদেন সম্পাদন করতে চান? আমরা লেনদেনের বিচ্ছিন্নতা অধ্যয়ন করে এই প্রশ্নের উত্তর খুঁজতে শুরু করব ...
লেনদেন বিচ্ছিন্নতা স্তর হল একটি শর্তাধীন মান যা ডিবিএমএস-এ যৌক্তিকভাবে সমান্তরাল লেনদেন সম্পাদনের ফলে অসঙ্গতিপূর্ণ ডেটা অনুমোদিত হওয়ার পরিমাণ নির্ধারণ করে। লেনদেন বিচ্ছিন্নতা স্তরের স্কেলে সর্বনিম্ন থেকে সর্বোচ্চ পর্যন্ত র্যাঙ্ক করা বেশ কয়েকটি মান রয়েছে; একটি উচ্চতর বিচ্ছিন্নতা স্তর ভাল ডেটা সামঞ্জস্যের সাথে মিলে যায়, তবে এর ব্যবহার শারীরিকভাবে সমান্তরাল লেনদেনের সংখ্যা হ্রাস করতে পারে।
বিপরীতভাবে, একটি নিম্ন বিচ্ছিন্নতা স্তর আরও সমান্তরাল লেনদেনের অনুমতি দেয়, কিন্তু ডেটা সঠিকতা হ্রাস করে। এইভাবে, ব্যবহৃত লেনদেন বিচ্ছিন্নতার স্তর নির্বাচন করে, তথ্য সিস্টেমের বিকাশকারী, একটি নির্দিষ্ট পরিমাণে, কাজের গতি এবং সিস্টেম থেকে প্রাপ্ত ডেটার গ্যারান্টিযুক্ত ধারাবাহিকতা নিশ্চিত করার মধ্যে একটি পছন্দ প্রদান করে।
লেনদেন ব্যবহার করে সমসাময়িক অ্যাক্সেসের সমস্যা
যখন লেনদেন সমান্তরালভাবে সম্পাদিত হয়, তখন নিম্নলিখিত সমস্যাগুলি সম্ভব:
- হারিয়ে গেছে আপডেট - যদি একটি ডেটা ব্লক একই সাথে বিভিন্ন লেনদেনের মাধ্যমে পরিবর্তিত হয়, তবে শেষটি বাদে সমস্ত পরিবর্তনগুলি হারিয়ে যায়;
- "নোংরা" রিডিং (ইঞ্জি. ডার্টি রিড) - একটি লেনদেনের দ্বারা ডেটা যোগ করা বা পরিবর্তিত পড়া, যা পরবর্তীতে নিশ্চিত করা হবে না (রোল ব্যাক);
- নন-রিপিটেবল রিড (ইঞ্জি. নন-রিপিটেবল রিড) - একই লেনদেনের মধ্যে রি-রিড করার সময়, পূর্বে পড়া ডেটা পরিবর্তন করা হয়;
- ফ্যান্টম রিডস - একটি লেনদেন তার সম্পাদনের সময় একাধিকবার একই মানদণ্ড অনুসারে অনেক সারি নির্বাচন করে। এই ফেচগুলির মধ্যে আরেকটি লেনদেন সারি যোগ করে বা প্রথম লেনদেনের আনার মানদণ্ডে ব্যবহৃত কিছু সারির কলাম পরিবর্তন করে এবং সফলভাবে শেষ হয়। ফলস্বরূপ, এটি চালু হবে যে প্রথম লেনদেনে একই নির্বাচনগুলি সারিগুলির বিভিন্ন সেট দেয়৷
এই সমস্যাগুলি ঘটতে পারে এমন পরিস্থিতিতে বিবেচনা করুন।
1.2 আপডেট হারিয়েছে
পরিস্থিতি যখন, যখন একটি ডেটা ব্লক একই সাথে বিভিন্ন লেনদেনের মাধ্যমে পরিবর্তিত হয়, পরিবর্তনগুলির একটি হারিয়ে যায়।
ধরুন একই সময়ে দুটি লেনদেন চলছে:
লেনদেন ঘ | লেনদেন 2 |
---|---|
আপডেট tbl1 সেট f2=f2+20 যেখানে f1=1; | আপডেট tbl1 সেট f2=f2+25 যেখানে f1=1; |
উভয় লেনদেনে, f2 ক্ষেত্রের মান পরিবর্তিত হয়; সমাপ্তির পরে, ক্ষেত্রের মান অবশ্যই 45 দ্বারা বৃদ্ধি করা উচিত। প্রকৃতপক্ষে, কর্মের নিম্নলিখিত ক্রম ঘটতে পারে:
- উভয় লেনদেন একই সাথে ক্ষেত্রের বর্তমান অবস্থা পড়ে। এখানে সঠিক ফিজিক্যাল কনকারেন্সির প্রয়োজন নেই, অন্য লেনদেনের ফলাফল লেখার আগে এটিই যথেষ্ট যে ক্রমানুসারে দ্বিতীয় পঠিত অপারেশনটি সম্পূর্ণ হয়।
- উভয় লেনদেনই আগের পঠিত মানের সাথে যথাক্রমে 20 এবং 25 যোগ করে নতুন ক্ষেত্রের মান গণনা করে।
- লেনদেন ক্ষেত্র f2 ফিরে হিসাবের ফলাফল লিখতে চেষ্টা করুন. যেহেতু একই সময়ে দুটি লেখা সম্পাদন করা শারীরিকভাবে অসম্ভব, বাস্তবে একটি লেখার অপারেশন আগে সঞ্চালিত হবে, অন্যটি পরে। দ্বিতীয় রাইট অপারেশন প্রথমটির ফলাফল ওভাররাইট করবে।
ফলস্বরূপ, উভয় লেনদেন সম্পন্ন হওয়ার পরে, f2 ক্ষেত্রের মান 45 বাড়তে পারে না, কিন্তু 20 বা 25 দ্বারা বাড়তে পারে, অর্থাৎ, ডেটা পরিবর্তনকারী লেনদেনের একটি "অদৃশ্য" হয়ে যাবে৷
1.3 "নোংরা" পড়া
একটি লেনদেনের দ্বারা যুক্ত বা পরিবর্তিত ডেটা পড়া যা পরে প্রতিশ্রুতিবদ্ধ হতে ব্যর্থ হবে (রোলব্যাক)।
ধরুন আমাদের দুটি লেনদেন বিভিন্ন অ্যাপ্লিকেশন দ্বারা খোলা আছে যেগুলি নিম্নলিখিত SQL স্টেটমেন্টগুলি চালায়:
লেনদেন ঘ | লেনদেন 2 |
---|---|
আপডেট tbl1 সেট f2=f2+1 যেখানে f1=1; | |
tbl1 থেকে f2 নির্বাচন করুন যেখানে f1=1; | |
রোলব্যাক কাজ; |
লেনদেন 1 এ, ক্ষেত্র f2-এর মান পরিবর্তন করা হয়, এবং তারপর লেনদেন 2-এ, এই ক্ষেত্রের মান নির্বাচন করা হয়। এর পরে, লেনদেন 1 রোল ব্যাক করা হয়৷ ফলস্বরূপ, দ্বিতীয় লেনদেনের দ্বারা প্রাপ্ত মান ডাটাবেসে সংরক্ষিত মানের থেকে আলাদা হবে৷
1.4 অ-পুনরাবৃত্ত পড়া
পরিস্থিতি যখন একই লেনদেনের মধ্যে পুনরায় পড়ার সময়, পূর্বে পড়া ডেটা পরিবর্তিত হয়।
ধরুন আমাদের দুটি লেনদেন বিভিন্ন অ্যাপ্লিকেশন দ্বারা খোলা আছে যেগুলি নিম্নলিখিত SQL স্টেটমেন্টগুলি চালায়:
লেনদেন ঘ | লেনদেন 2 |
---|---|
tbl1 থেকে f2 নির্বাচন করুন যেখানে f1=1; | |
আপডেট tbl1 সেট f2=f2+3 যেখানে f1=1; | |
কমিট; | |
tbl1 থেকে f2 নির্বাচন করুন যেখানে f1=1; |
লেনদেন 2-এ, ক্ষেত্রের f2-এর মান নির্বাচন করা হয়, তারপর লেনদেন 1-এ, ক্ষেত্রের f2-এর মান পরিবর্তন করা হয়। আপনি যদি লেনদেন 2 এ ক্ষেত্র f2 থেকে একটি মান নির্বাচন করার জন্য আবার চেষ্টা করেন, তাহলে একটি ভিন্ন ফলাফল পাওয়া যাবে। এই পরিস্থিতিটি বিশেষভাবে অগ্রহণযোগ্য যখন ডেটা আংশিকভাবে সংশোধন করার জন্য এবং এটি ডাটাবেসে লেখার জন্য পড়া হয়।
1.5 "ফ্যান্টম" পড়া
পরিস্থিতি যখন, একই লেনদেনের মধ্যে বারবার পড়ার সময়, একই নির্বাচন সারিগুলির বিভিন্ন সেট দেয়।
ধরুন বিভিন্ন অ্যাপ্লিকেশন দ্বারা খোলা দুটি লেনদেন রয়েছে যা নিম্নলিখিত SQL বিবৃতিগুলি কার্যকর করে:
লেনদেন ঘ | লেনদেন 2 |
---|---|
tbl1 থেকে SUM(f2) নির্বাচন করুন; | |
tbl1 (f1,f2) VALUES(15,20); | |
কমিট; | |
tbl1 থেকে SUM(f2) নির্বাচন করুন; |
লেনদেন 2 একটি SQL বিবৃতি কার্যকর করে যা f2 ক্ষেত্রের সমস্ত মান ব্যবহার করে। তারপরে লেনদেন 1-এ একটি নতুন সারি ঢোকানো হয়, যার ফলে লেনদেন 2-এ SQL স্টেটমেন্টের পুনরায় সঞ্চালন একটি ভিন্ন ফলাফল তৈরি করে। এই পরিস্থিতিকে ফ্যান্টম রিডিং (ফ্যান্টম রিডিং) বলা হয়। এটি অ-পুনরাবৃত্তিযোগ্য পড়ার থেকে পৃথক যে বারবার ডেটা অ্যাক্সেসের ফলাফলটি ডেটার পরিবর্তন/মুছে ফেলার কারণে নয়, বরং নতুন (ফ্যান্টম) ডেটার উপস্থিতির কারণে পরিবর্তিত হয়েছে।
GO TO FULL VERSION