ব্যাংকের টাকা ট্রান্সফারের কথা চিন্তা করুন: এক অ্যাকাউন্ট থেকে টাকা কাটা হলো, কিন্তু অন্য অ্যাকাউন্টে জমা হওয়ার আগেই সিস্টেম ক্র্যাশ করলো – টাকাটা তাহলে গেল কোথায়? এই ধরনের বিপর্যয় এড়াতেই ডাটাবেসে ট্রানজ্যাকশন (Transaction) ব্যবহৃত হয়। একটি ট্রানজ্যাকশন হলো কতগুলো SQL স্টেটমেন্টের একটি ইউনিট, যা একটি যৌক্তিক কাজ সম্পাদন করে। এই ইউনিটের সবগুলো স্টেটমেন্ট সফলভাবে সম্পন্ন হলে তবেই পরিবর্তন স্থায়ী হয়; কোনো একটি ব্যর্থ হলে সম্পূর্ণ ইউনিট বাতিল হয়ে পূর্বাবস্থায় ফিরে যায়। SQLite-তে ট্রানজ্যাকশন নিয়ন্ত্রণের জন্য রয়েছে BEGIN, COMMIT, এবং ROLLBACK কমান্ড। আজ আমরা ট্রানজ্যাকশনের ACID বৈশিষ্ট্য, এই কমান্ডগুলোর ব্যবহার, এবং বাস্তব উদাহরণ বিস্তারিত শিখব।
পূর্বপ্রস্তুতি
- SQLite ইন্সটল থাকতে হবে (সিরিজের ৩য় পর্ব দেখুন)।
COMPANYটেবিলসহtransaction_demo.dbডাটাবেস তৈরি করি।
টার্মিনাল:
bash
sqlite3 transaction_demo.db
sql
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO COMPANY VALUES (1, 'Paul', 32, 'California', 20000.00); INSERT INTO COMPANY VALUES (2, 'Allen', 25, 'Texas', 15000.00); INSERT INTO COMPANY VALUES (3, 'Teddy', 23, 'Norway', 20000.00); INSERT INTO COMPANY VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00); INSERT INTO COMPANY VALUES (5, 'David', 27, 'Texas', 85000.00); INSERT INTO COMPANY VALUES (6, 'Kim', 22, 'South-Hall', 45000.00); INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00);
- আউটপুট সুন্দর করতে:
.header on,.mode column।
১. ট্রানজ্যাকশন কী ও কেন?
ট্রানজ্যাকশন হলো ডাটাবেস অপারেশনের একটি ধারা, যার চারটি গ্যারান্টি থাকে – সংক্ষেপে ACID:
- Atomicity (অটোমিসিটি): ট্রানজ্যাকশনের সব কাজ সম্পন্ন হবে, নতুবা একটিও না। অর্ধেক সফল, অর্ধেক ব্যর্থ – এটা চলবে না।
- Consistency (কনসিসটেন্সি): ট্রানজ্যাকশনের পর ডাটাবেস একটি বৈধ অবস্থা থেকে আরেকটি বৈধ অবস্থায় যাবে। সব কনস্ট্রেইন্ট অক্ষুণ্ণ থাকবে।
- Isolation (আইসোলেশন): একই সময়ে একাধিক ট্রানজ্যাকশন চললে তারা একে অপরের কাজে হস্তক্ষেপ করবে না।
- Durability (ডিউরেবিলিটি): একবার কমিট করা পরিবর্তন স্থায়ী; সিস্টেম ক্র্যাশ করলেও টিকে থাকবে।
SQLite সম্পূর্ণ ACID-সম্মত এবং একাধিক প্রসেস বা থ্রেডের মধ্যেও নিরাপদ ট্রানজ্যাকশন নিশ্চিত করে (যথাযথ লকিং মেকানিজম সহ)।
২. ট্রানজ্যাকশন কন্ট্রোল কমান্ড
SQLite-তে তিনটি মৌলিক কমান্ড ট্রানজ্যাকশন পরিচালনা করে:
| কমান্ড | কাজ |
|---|---|
BEGIN; বা BEGIN TRANSACTION; | ট্রানজ্যাকশন শুরু করে। |
COMMIT; বা END TRANSACTION; | ট্রানজ্যাকশনের সব পরিবর্তন স্থায়ীভাবে সংরক্ষণ করে। |
ROLLBACK; | শেষ BEGIN-এর পরের সব পরিবর্তন বাতিল করে পূর্বাবস্থায় ফেরায়। |
গুরুত্বপূর্ণ: ট্রানজ্যাকশন কমান্ডগুলো শুধুমাত্র DML (INSERT, UPDATE, DELETE) অপারেশনের জন্য প্রযোজ্য। DDL (CREATE, DROP, ALTER) সাধারণত অটো-কমিট হয় এবং ROLLBACK করা যায় না।
৩. ROLLBACK-এর মাধ্যমে পরিবর্তন বাতিল
প্রথমে একটি ট্রানজ্যাকশন শুরু করে কিছু পরিবর্তন করব, তারপর ROLLBACK করে তা ফিরিয়ে নেব।
sql
BEGIN; DELETE FROM COMPANY WHERE AGE = 25;
এই কমান্ডে AGE = 25 এমন দুইজন (Allen ও Mark) ডিলিট হবে। কিন্তু আমরা এখনো কমিট করিনি।
চেক করি:
sql
SELECT * FROM COMPANY; -- Allen (ID 2) ও Mark (ID 4) আর দেখা যাচ্ছে না।
এখন ROLLBACK দিই:
sql
ROLLBACK; SELECT * FROM COMPANY;
ফলাফল: Allen ও Mark ফিরে এসেছে! কারণ ROLLBACK শেষ BEGIN-এর পরের সব পরিবর্তন আনডু করে দিয়েছে। টেবিল আগের সম্পূর্ণ অবস্থায় ফিরে গেছে।
৪. COMMIT-এর মাধ্যমে পরিবর্তন স্থায়ীকরণ
এবার আমরা COMMIT ব্যবহার করে পরিবর্তন স্থায়ী করব।
sql
BEGIN; DELETE FROM COMPANY WHERE AGE = 25; COMMIT;
এখন SELECT * FROM COMPANY; দিলে Allen (ID 2) ও Mark (ID 4) আর দেখা যাবে না – তারা স্থায়ীভাবে ডিলিট হয়েছে। এবার আর ROLLBACK করলে তাদের ফেরত পাওয়া যাবে না, কারণ কমিট হয়ে গেছে।
বাকি থাকা টেবিল:
text
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
৫. স্বয়ংক্রিয় রোলব্যাক (এরর বা সংযোগ বিঘ্ন)
যদি ট্রানজ্যাকশনের মধ্যে কোনো এসকিউএল এরর হয়, অথবা .quit করার আগে কমিট না করে সংযোগ বন্ধ হয়, তাহলে SQLite স্বয়ংক্রিয়ভাবে ROLLBACK করে পরিবর্তন বাতিল করে। এটি ডেটা নিরাপত্তা নিশ্চিত করে।
উদাহরণ:
sql
BEGIN; UPDATE COMPANY SET SALARY = 99999 WHERE ID = 1; -- ইচ্ছাকৃতভাবে একটি এরর তৈরি করা হলো (যেমন ভুল কলাম নাম) UPDATE COMPANY SET WRONG_COLUMN = 0 WHERE ID = 1; -- এরর! COMMIT;
এররের কারণে ট্রানজ্যাকশন ফেইল করবে এবং UPDATE পরিবর্তনটি কার্যকর হবে না।
৬. ডিরেক্টরি স্ট্রাকচার ও প্যাকেজ
শুধুমাত্র transaction_demo.db ফাইলটি ব্যবহৃত হচ্ছে। কোনো অতিরিক্ত প্যাকেজ প্রয়োজন নেই।
text
project-folder/ └── transaction_demo.db
৭. গুরুত্বপূর্ণ টিপস
- সবসময় BEGIN ও COMMIT/ROLLBACK জুটি বাঁধুন: আপনি যখন একাধিক টেবিলে সম্পর্কিত ডেটা পরিবর্তন করবেন, অবশ্যই ট্রানজ্যাকশন ব্যবহার করুন।
- DML-এই প্রযোজ্য: INSERT, UPDATE, DELETE-এ ট্রানজ্যাকশন কাজ করে। CREATE বা DROP টেবিল অটো-কমিট হয়।
- সেভপয়েন্ট (SAVEPOINT): বড় ট্রানজ্যাকশনের মধ্যে আংশিক রোলব্যাক করতে
SAVEPOINT nameএবংROLLBACK TO nameব্যবহার করতে পারেন। (পরবর্তী পর্বে আলোচিত হতে পারে।) - লকিং: ট্রানজ্যাকশন চলাকালে SQLite প্রয়োজনীয় লক নিয়ে নেয়, যাতে ডেটা কারাপ্ট না হয়।
- পাইথন/জাভা থেকে ব্যবহার: প্রোগ্রামিং ল্যাঙ্গুয়েজে সাধারণত
connection.commit()ওconnection.rollback()মেথড কল করে ট্রানজ্যাকশন কন্ট্রোল করা হয়। SQL-এ সরাসরিBEGIN;লিখতে হবে না, কারণ লাইব্রেরি অটো-কমিট মোড ম্যানেজ করে।
৮. সম্পূর্ণ অনুশীলন সেশন
টার্মিনালে নিচের ধাপগুলো চালিয়ে দেখুন:
sql
.headers on .mode column -- প্রাথমিক অবস্থা দেখি SELECT * FROM COMPANY; -- ১. ট্রানজ্যাকশন শুরু, কিছু ইনসার্ট ও আপডেট, তারপর রোলব্যাক BEGIN; INSERT INTO COMPANY VALUES (8, 'Rahim', 30, 'Dhaka', 40000); UPDATE COMPANY SET SALARY = 30000 WHERE ID = 3; SELECT * FROM COMPANY; -- পরিবর্তন দেখা যাবে ROLLBACK; SELECT * FROM COMPANY; -- আগের অবস্থায় ফিরে গেছে, Rahim নেই -- ২. ট্রানজ্যাকশন কমিট করে পরিবর্তন স্থায়ী করা BEGIN; INSERT INTO COMPANY VALUES (9, 'Karim', 28, 'CTG', 50000); COMMIT; SELECT * FROM COMPANY; -- Karim স্থায়ীভাবে আছে -- ৩. এরর দ্বারা রোলব্যাক (ঐচ্ছিক প্রদর্শন) BEGIN; UPDATE COMPANY SET SALARY = 0 WHERE ID = 9; -- ভুল কমান্ড (এরর হবে, ট্রানজ্যাকশন রোলব্যাক হবে) UPDATE COMPANY SET NON_EXISTENT_COL = 1 WHERE ID = 9; COMMIT; SELECT * FROM COMPANY WHERE ID = 9; -- SALARY 50000 ই আছে, 0 হয়নি
পরবর্তী পর্বে
আমরা শিখব SQLite Subqueries – কিভাবে একটি SELECT-এর ভেতর আরেকটি SELECT ব্যবহার করে জটিল প্রশ্নের উত্তর পাওয়া যায়।
লেখকের কথা: ট্রানজ্যাকশন সঠিকভাবে ব্যবহার করলে আপনার ডেটা সবসময় নিরাপদ ও নির্ভুল থাকবে। বাংলায় প্রযুক্তি শিক্ষার এই সিরিজ চলমান রাখতে আপনার উৎসাহ ও সহায়তা অপরিহার্য। পোস্টটি ভালো লাগলে বন্ধুদের সাথে শেয়ার করুন, এবং সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। আপনার যে কোনো জিজ্ঞাসা কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
