মডিউল পাঠ (4/4)
লেনদেন: সব বা কিছুই না
একটি লেনদেন হল অপারেশনগুলির একটি গ্রুপ যা ডাটাবেস হিসাবে বিবেচনা করে
একক একক: হয় তারা সবাই সফল হয়, অথবা তাদের কেউই ক
ট্রেস এটি আপনি যখন একটি ক্রম অসঙ্গতি থেকে নিজেকে রক্ষা কিভাবে
UPDATE/INSERT/DELETE এর মধ্যে সঙ্গতিপূর্ণ থাকতে হবে।
বাক্য গঠন
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 fosseBEGIN এবং COMMIT এর মধ্যে সবকিছুই পারমাণবিক: অন্য কোনো সংযোগ নেই
মধ্যবর্তী অবস্থা দেখে। যদি প্রোগ্রাম ক্র্যাশ হয় বা এক্সিকিউট হয়
ROLLBACK, ডাটাবেস ঠিক সেইভাবে থাকে যেমনটি BEGIN এর আগে ছিল।
ক্লাসিক দৃশ্যকল্প: স্থানান্তর
ক্যানোনিকাল উদাহরণ হল পণ্যগুলির মধ্যে একটি স্টক স্থানান্তর (বা একটি অর্থ
অ্যাকাউন্টগুলির মধ্যে স্থানান্তর: দুটি UPDATE যেগুলি অবশ্যই একসাথে সফল হবে,
কখনও একটি হ্যাঁ এবং অন্যটি না।
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 এর ডিবাগার
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 — ডাটাবেসটি ঠিক তেমনই
এটা আগে ছিল.
সেভপয়েন্ট: আংশিক রোলব্যাক
একটি লেনদেনের ভিতরে আপনি মধ্যবর্তী পয়েন্ট তৈরি করতে পারেন:
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 confermato30 সেকেন্ডের মধ্যে ACID
লেনদেন ACID বৈশিষ্ট্যের গ্যারান্টি দেয়:
- একটি অপ্রীতিকরতা — সব বা কিছুই নয়;
- Cসংগতি — লেনদেনের শুরুতে এবং শেষে সীমাবদ্ধতাগুলি সন্তুষ্ট থাকে;
- Iসোলেশন — সমসাময়িক লেনদেন মধ্যবর্তী অবস্থা দেখতে পায় না (বিভিন্ন "স্তরে");
- Dনির্ভরতা — একটি সফল
COMMITক্র্যাশের ক্ষেত্রেও হারিয়ে যায় না।
তোমার পালা
একটি একক লেনদেনে: পণ্য 1 এর স্টক 1 দ্বারা হ্রাস এবং পণ্যের স্টক 1 দ্বারা বৃদ্ধি 2. BEGIN দিয়ে খুলুন এবং COMMIT এর সাথে বন্ধ করুন৷
ইঙ্গিত দেখান
রেফারেন্স স্টক - 1 এবং স্টক + 1 সংশ্লিষ্ট SET ধারাগুলিতে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
একটি লেনদেন খুলুন, গ্রাহকের শহর id=1 দিয়ে 'Sperimentale'-এ আপডেট করার চেষ্টা করুন, তারপর ROLLBACK দিয়ে অপারেশনটি বাতিল করুন৷ শেষে গ্রাহক 1 এর শহরটি অবশ্যই আসল ('Milano') হতে হবে।
ইঙ্গিত দেখান
ROLLBACK BEGIN থেকে করা প্রতিটি পরিবর্তন বাতিল করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ