মূল কন্টেন্টে যান
মডিউল 11 · 1-এর পাঠ 4কোর্সে 41/57~15 min
মডিউল পাঠ (1/4)

ACID লেনদেন (BEGIN/COMMIT)

যেকোন ডাটাবেসের নির্ভরযোগ্যতার ভিত্তি ACID সংক্ষিপ্ত রূপের উপর নির্ভর করে:

  • Aটমিসিটি: একটি অপারেশন হয় সম্পূর্ণভাবে সম্পন্ন হয় (কমিট), অথবা অর্ধ-সমাপ্ত কোনো চিহ্ন পিছনে না রেখে ব্যর্থ হয় (রোলব্যাক)।
  • Cসংগতি: ডাটাবেস নিয়মগুলি (যেমন সীমাবদ্ধতা, বিদেশী কী) সর্বদা সম্মান করা হয়।
  • Iসোলেশন: একই সময়ে ঘটে যাওয়া লেনদেনগুলি অনিয়ন্ত্রিত উপায়ে একে অপরের সাথে হস্তক্ষেপ করে না।
  • Dনির্ভরতা: একটি প্রতিশ্রুতির পরে, পরিবর্তনটি অপরিবর্তনীয়ভাবে ডিস্কে লেখা হয়।

লেনদেন সিনট্যাক্স

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

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

এই জটিল এক্সিকিউশনের সময় যদি জাভাস্ক্রিপ্ট অ্যাপ যেটি ক্যোয়ারীটি পাঠিয়েছে তা বুঝতে পারে যে একটি সমস্যা আছে (উদাহরণস্বরূপ গুদামে পর্যাপ্ত স্টক নেই এবং এটি ক্র্যাশ হয়ে গেছে), এটি একটি পাঠাবে:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

নিজে চেষ্টা করে দেখুন

ব্যায়াম#sql.m11.l1.e1
প্রচেষ্টা: 0লোড হচ্ছে...

একটি লেনদেন খুলুন।\nঅস্থায়ী সারণীতে আইডি 10 এর 'পরিমাণ' 0 সেট করে পণ্যটিকে আপডেট করুন (অপেক্ষা করবেন না, 'পরিমাণ' পণ্যগুলিতে নেই, আসুন উদ্ভাবন করি: 'order_items'-এ 'unit_price' পরিবর্তন করুন কিন্তু এর জন্য একটি বাধা প্রয়োজন।\nআসুন আরও ভাল করা যাক: 'আইডি 5 সফলভাবে ট্রান্সফুল করার স্ট্যাটাস আপডেট করুন'।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

BEGIN; দিয়ে শুরু করুন, id = 5-এর অর্ডারকে status='shipped'-এ পরিবর্তন করুন, তারপর COMMIT দিয়ে পাঠান;

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#sql.m11.l1.e2
প্রচেষ্টা: 0লোড হচ্ছে...

উৎপাদনে আতঙ্ক! একজন দেব WHERE ব্যতীত একটি DELETE লিখেছেন, ঐতিহাসিকভাবে সমস্ত পর্যালোচনা মুছে দিয়েছেন৷\nআসুন তাদের দেখাই কিভাবে রোলব্যাক করা হয়৷ একটি লেনদেন শুরু করুন, একটি দ্রুত মুছে ফেলুন যা 'রিভিউ' থেকে সবকিছু মুছে দেয় (কোনও ক্লজ ছাড়াই), কিন্তু তারপর ব্লকটি সম্পূর্ণ করার আগে প্রভাবটি পূর্বাবস্থায় ফিরিয়ে আনতে SQL লাইফসেভার ব্যবহার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

শুরু; শেষে

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ