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

লেনদেন: সব বা কিছুই না

একটি লেনদেন হল অপারেশনগুলির একটি গ্রুপ যা ডাটাবেস হিসাবে বিবেচনা করে একক একক: হয় তারা সবাই সফল হয়, অথবা তাদের কেউই ক ট্রেস এটি আপনি যখন একটি ক্রম অসঙ্গতি থেকে নিজেকে রক্ষা কিভাবে UPDATE/INSERT/DELETE এর মধ্যে সঙ্গতিপূর্ণ থাকতে হবে।

বাক্য গঠন

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

BEGIN এবং COMMIT এর মধ্যে সবকিছুই পারমাণবিক: অন্য কোনো সংযোগ নেই মধ্যবর্তী অবস্থা দেখে। যদি প্রোগ্রাম ক্র্যাশ হয় বা এক্সিকিউট হয় ROLLBACK, ডাটাবেস ঠিক সেইভাবে থাকে যেমনটি BEGIN এর আগে ছিল।

ক্লাসিক দৃশ্যকল্প: স্থানান্তর

ক্যানোনিকাল উদাহরণ হল পণ্যগুলির মধ্যে একটি স্টক স্থানান্তর (বা একটি অর্থ অ্যাকাউন্টগুলির মধ্যে স্থানান্তর: দুটি UPDATE যেগুলি অবশ্যই একসাথে সফল হবে, কখনও একটি হ্যাঁ এবং অন্যটি না।

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

যদি দ্বিতীয় UPDATE ব্যর্থ হয় (যেমন একটি CHECK সীমাবদ্ধতা ত্রুটি), একটি ROLLBACK পণ্য 1 এর স্টককে তার আসল মানতে পুনরুদ্ধার করে।

রোলব্যাক: DBA এর ডিবাগার

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

বাস্তব ডেটাতে একটি UPDATE চেষ্টা করার জন্য একটি খুব দরকারী প্যাটার্ন: আপনি এটি চালান, একই লেনদেনে একটি SELECT দিয়ে ফলাফল পরীক্ষা করুন এবং যদি এটি আপনাকে সন্তুষ্ট না করে, আপনি ROLLBACK — ডাটাবেসটি ঠিক তেমনই এটা আগে ছিল.

সেভপয়েন্ট: আংশিক রোলব্যাক

একটি লেনদেনের ভিতরে আপনি মধ্যবর্তী পয়েন্ট তৈরি করতে পারেন:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

30 সেকেন্ডের মধ্যে ACID

লেনদেন ACID বৈশিষ্ট্যের গ্যারান্টি দেয়:

  • একটি অপ্রীতিকরতা — সব বা কিছুই নয়;
  • Cসংগতি — লেনদেনের শুরুতে এবং শেষে সীমাবদ্ধতাগুলি সন্তুষ্ট থাকে;
  • Iসোলেশন — সমসাময়িক লেনদেন মধ্যবর্তী অবস্থা দেখতে পায় না (বিভিন্ন "স্তরে");
  • Dনির্ভরতা — একটি সফল COMMIT ক্র্যাশের ক্ষেত্রেও হারিয়ে যায় না।

তোমার পালা

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

একটি একক লেনদেনে: পণ্য 1 এর স্টক 1 দ্বারা হ্রাস এবং পণ্যের স্টক 1 দ্বারা বৃদ্ধি 2. BEGIN দিয়ে খুলুন এবং COMMIT এর সাথে বন্ধ করুন৷

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

রেফারেন্স স্টক - 1 এবং স্টক + 1 সংশ্লিষ্ট SET ধারাগুলিতে।

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

ব্যায়াম পর্যালোচনা করুন

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

একটি লেনদেন খুলুন, গ্রাহকের শহর id=1 দিয়ে 'Sperimentale'-এ আপডেট করার চেষ্টা করুন, তারপর ROLLBACK দিয়ে অপারেশনটি বাতিল করুন৷ শেষে গ্রাহক 1 এর শহরটি অবশ্যই আসল ('Milano') হতে হবে।

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

ROLLBACK BEGIN থেকে করা প্রতিটি পরিবর্তন বাতিল করে।

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