Transactions
51. What is a transaction?
Transaction হল database operations এর একটি logical unit যা complete হতে হবে as a whole অথবা একেবারেই হবে না। এটি database consistency এবং integrity maintain করার জন্য অত্যন্ত গুরুত্বপূর্ণ।
Technical definition: Transaction হল এক বা একাধিক SQL statements এর একটি sequence যা একসাথে execute হয় এবং সফল হলে সব changes permanent হয়, আর fail হলে সব changes undo হয়ে যায়।
Why are transactions important?
Transactions গুরুত্বপূর্ণ কয়েকটি কারণে:
1. Data Consistency:
-- Bank transfer example
BEGIN TRANSACTION
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A001'; -- Debit
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'A002'; -- Credit
COMMIT;
যদি first UPDATE successful হয় কিন্তু second UPDATE fail হয়, transaction rollback হবে। এতে data inconsistent হবে না।
2. Business Logic Protection:
Code ExampleSQLClick to view details
-- E-commerce order processing
BEGIN TRANSACTION
INSERT INTO orders (customer_id, total_amount) VALUES (123, 500);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 'P001';
INSERT INTO order_items (order_id, product_id, quantity) VALUES (LAST_INSERT_ID(), 'P001', 1);
-- If any operation fails, entire order is cancelled
COMMIT;
3. Multi-user Environment:
- একই সময়ে multiple users যখন same data modify করে
- Transaction isolation প্রদান করে
- Data corruption prevent করে
What makes a transaction atomic?
Atomicity হল ACID properties এর মধ্যে প্রথমটি। এর মানে transaction এর সব operations either completely successful হবে অথবা completely fail হবে।
All-or-Nothing Principle:
Code ExampleSQLClick to view details
-- Atomic transaction example
BEGIN TRANSACTION
DELETE FROM order_items WHERE order_id = 12345; -- Step 1
DELETE FROM payments WHERE order_id = 12345; -- Step 2
DELETE FROM orders WHERE order_id = 12345; -- Step 3
-- If Step 2 fails, Step 1 will be rolled back automatically
COMMIT;
Implementation Mechanisms:
- Write-Ahead Logging (WAL): Changes log এ লেখা হয় before actual data modification
- Shadow Paging: Original data copy রাখা হয় until transaction commits
- Rollback Segments: Undo information store করা হয় automatic rollback এর জন্য
52. What is COMMIT and ROLLBACK?
COMMIT এবং ROLLBACK হল transaction control করার জন্য দুটি fundamental commands।
COMMIT Statement:
COMMIT transaction এর সব changes কে permanent করে database এ।
BEGIN TRANSACTION
INSERT INTO employees (name, department, salary) VALUES ('রহিম', 'IT', 50000);
UPDATE employees SET salary = salary * 1.1 WHERE department = 'IT';
COMMIT; -- এখন সব changes permanent
COMMIT এর পরে কী হয়:
- সব changes physical storage এ write হয়
- Transaction locks release হয়
- Other transactions এখন এই changes দেখতে পাবে
- Rollback আর possible না
ROLLBACK Statement:
ROLLBACK transaction এর সব changes কে undo করে দেয়।
BEGIN TRANSACTION
DELETE FROM products WHERE category = 'Electronics';
-- Oops! এটা ভুল হয়েছে
ROLLBACK; -- সব deletions undo হবে
ROLLBACK এর পরে কী হয়:
- সব uncommitted changes undo হয়
- Database আগের state এ ফিরে যায়
- Transaction locks release হয়
- Memory থেকে temporary changes clear হয়
Can you rollback after commit?
না, COMMIT এর পরে ROLLBACK করা যায় না। COMMIT একবার execute হলে changes permanent হয়ে যায়।
BEGIN TRANSACTION
UPDATE products SET price = price * 0.5; -- 50% discount
COMMIT; -- Changes are now permanent
ROLLBACK; -- ❌ This will give error: "No active transaction to rollback"
তবে alternatives আছে:
1. Explicit Reverse Operations:
-- Manual undo through reverse operations
UPDATE products SET price = price * 2; -- Reverse the 50% discount
2. Database Backup Recovery:
-- Restore from backup (if available)
RESTORE DATABASE mydb FROM BACKUP_FILE = 'backup_before_changes.bak';
3. Point-in-Time Recovery:
-- MySQL example
mysqlbinlog --start-datetime="2023-12-01 10:00:00"
--stop-datetime="2023-12-01 09:59:59"
binlog_file | mysql -u root -p
What is auto-commit mode?
Auto-commit mode হল database এর একটি setting যেখানে প্রতিটি individual SQL statement automatically commit হয়ে যায়।
Auto-commit ON (Default in most databases):
-- Each statement commits automatically
INSERT INTO users (name) VALUES ('আলী'); -- Automatically committed
UPDATE users SET name = 'আলী আহমেদ' WHERE id = 1; -- Automatically committed
DELETE FROM users WHERE id = 1; -- Automatically committed
Auto-commit OFF:
Code ExampleSQLClick to view details
-- Disable auto-commit
SET autocommit = 0; -- MySQL
-- SET AUTOCOMMIT OFF; -- Oracle/PostgreSQL
INSERT INTO users (name) VALUES ('করিম');
UPDATE users SET age = 25 WHERE name = 'করিম';
-- Changes are not permanent yet
COMMIT; -- Now both changes are committed together
When to use Auto-commit OFF:
- Complex business operations
- Multiple related changes
- Error handling scenarios
- Performance optimization (batch operations)
Example: Bank Transfer with Auto-commit OFF:
Code ExampleSQLClick to view details
SET autocommit = 0;
BEGIN TRANSACTION;
-- Deduct from source account
UPDATE bank_accounts
SET balance = balance - 5000
WHERE account_number = 'ACC001';
-- Check if sufficient balance
IF (SELECT balance FROM bank_accounts WHERE account_number = 'ACC001') < 0 THEN
ROLLBACK;
SELECT 'Insufficient funds' as error_message;
ELSE
-- Credit to destination account
UPDATE bank_accounts
SET balance = balance + 5000
WHERE account_number = 'ACC002';
COMMIT;
SELECT 'Transfer successful' as success_message;
END IF;
53. What is SAVEPOINT in SQL?
SAVEPOINT মূলত একটি বড় বা জটিল ট্রানজেকশনের ভেতরে ছোট ছোট "চেকপয়েন্ট" (checkpoints) তৈরি করতে ব্যবহৃত হয়। এটি আপনাকে পুরো ট্রানজেকশনটি বাতিল না করে কেবল একটি নির্দিষ্ট অংশ পর্যন্ত Partial Rollback করার সুবিধা দেয়।
Basic SAVEPOINT Syntax:
Code ExampleSQLClick to view details
BEGIN TRANSACTION;
-- Some operations
SAVEPOINT savepoint_name;
-- More operations
ROLLBACK TO savepoint_name; -- Rollback to savepoint only
-- Continue with transaction
COMMIT;
When is SAVEPOINT used?
SAVEPOINT সাধারণত নিচের ৩টি পরিস্থিতিতে সবচেয়ে বেশি ব্যবহৃত হয়
১.Complex Business Logic
অনেক সময় একটি ট্রানজেকশনে একাধিক কাজ থাকে। যেমন—একটি ই-কমার্স অর্ডারে কাস্টমার প্রোফাইল তৈরি করা এবং সাবস্ক্রিপশন কেনা। যদি সাবস্ক্রিপশন পেমেন্ট ফেইল করে, আপনি হয়তো পুরো transaction বাতিল না করে কেবল সাবস্ক্রিপশন অংশটুকু রোলব্যাক করতে চান এবং কাস্টমার প্রোফাইলটি সেভ রাখতে চান।
২.Error Recovery
বাল্ক ডেটা ইমপোর্ট বা বড় কোনো প্রসেসিংয়ের সময় যদি কোনো একটি নির্দিষ্ট ধাপে এরর আসে, তবে সেই ধাপ থেকে পুনরায় চেষ্টা করার জন্য সেভপয়েন্ট ব্যবহৃত হয়। এতে করে আগের সফল কাজগুলো নষ্ট হয় না।
Code ExampleSQLClick to view details
BEGIN TRANSACTION;
INSERT INTO table1 VALUES (...);
SAVEPOINT sp1; -- প্রথম ধাপ শেষে চেকপয়েন্ট
INSERT INTO table2 VALUES (...); -- এখানে এরর হলে
ROLLBACK TO sp1; -- কেবল table2 এর কাজ বাতিল হবে, table1 ঠিক থাকবে
COMMIT;
৩.Nested Operations
লুপ বা ফাংশনের ভেতরে যখন একাধিক অপারেশন চলে, তখন প্রতিটি লুপের শুরুতে একটি সেভপয়েন্ট রাখা বুদ্ধিমানের কাজ। এতে কোনো একটি আইটেম প্রসেস করতে সমস্যা হলে কেবল ওই আইটেমটি স্কিপ করে পরের আইটেমে যাওয়া সম্ভব হয়।
মনে রাখা জরুরি:
- ROLLBACK TO SAVEPOINT করার পর transaction কিন্তু শেষ হয়ে যায় না; আপনাকে সবশেষে COMMIT অথবা একটি ফাইনাল ROLLBACK করতে হবে।
- একবার COMMIT বা পুরো transaction ROLLBACK হয়ে গেলে ওই ট্রানজেকশনের সকল সেভপয়েন্ট মুছে যায়।
Can you have nested savepoints?
হ্যাঁ, nested savepoints support করা হয় কিন্তু implementation database specific।
Important Notes about Nested Savepoints:
- Savepoint names must be unique within same transaction
- Outer savepoint-এ rollback করলে পরের savepoint-এর lifecycle DBMS-ভেদে ভিন্ন; একই নাম reuse-এর behavior-ও যাচাই করতে হবে
- Memory usage increases with nested savepoints
- Performance impact grows with nesting depth
54. What are isolation levels?
Isolation levels হলো ডেটাবেস ম্যানেজমেন্ট সিস্টেমের (DBMS) একটি গুরুত্বপূর্ণ কনসেপ্ট যা নির্ধারণ করে যে, একটি transaction চলাকালীন অন্য transaction গুলো ওই ডেটা কীভাবে দেখতে পাবে। এটি ACID প্রপার্টিজের 'I' (Isolation) নিশ্চিত করে।
সহজ কথায়, একাধিক ইউজার যখন একই সময়ে একই ডেটা নিয়ে কাজ করেন, তখন তাদের কাজের মধ্যে যেন conflict না হয় এবং ডেটার নির্ভুলতা বজায় থাকে, সেটিই isolation লেভেল নিয়ন্ত্রণ করে
Four Standard Isolation Levels:
1. READ UNCOMMITTED (Level 0):
এটি সবচেয়ে নিচু স্তরের আইসোলেশন। এখানে একটি transaction অন্য ট্রানজেকশনের Uncommitted বা সেভ না হওয়া ডেটাও পড়তে পারে।
- সমস্যা: এতে Dirty Read ঘটে। অর্থাৎ, ডেটা সেভ হওয়ার আগেই আপনি তা দেখছেন, যা পরে বাতিল (Rollback) হতে পারে।
- ব্যবহার: যেখানে ডেটার ১০০% নির্ভুলতার চেয়ে পারফরম্যান্স বেশি জরুরি (যেমন- অ্যানালিটিক্ স)
2. READ COMMITTED (Level 1):
এটি অধিকাংশ ডেটাবেসের (যেমন- PostgreSQL, SQL Server, Oracle) default লেভেল। এখানে একটি transaction কেবল তখনই ডেটা পড়তে পারে যখন অন্য ট্রানজেকশনটি তা Commit করে।
- সুবিধা: Dirty Read প্রতিরোধ করে।
- সমস্যা: এতে Non-repeatable Read হতে পারে (একই ট্রানজেকশনে দুবার পড়লে ডেটা বদলে যেতে পারে)।
3. REPEATABLE READ (Level 2):
এই লেভেলে একই transaction থেকে একই row পুনরায় পড়লে পরিবর্তিত committed value দেখা ঠেকানো হয়। এটি lock বা MVCC দিয়ে হতে পারে; অন্য transaction update করতে পারবে কি না implementation-নির্ভর।
- সুবিধা: Non-repeatable Read প্রতিরোধ করে।
- সমস্যা: এতে Phantom Read হতে পারে (নতুন রো ইনসার্ট হলে তা আগের কুয়েরিতে ধরা পড়ে না কিন্তু পরেরব ার পড়ে)।
- নোট: MySQL-এর ডিফল্ট ইঞ্জিন InnoDB এই লেভেলে ফ্যান্টম রিডও প্রতিরোধ করতে পারে।
- ✅ Phantom Reads (allowed in some databases)
4. SERIALIZABLE (Level 3):
এটি সর্বোচ্চ standard isolation level। Concurrent transaction-এর ফল কোনো serial order-এর সমতুল্য হয়; transaction বাস্তবে একটির পর একটি চলতেই হবে এমন নয় এবং serialization failure হলে retry লাগতে পারে।
- সুবিধা: সকল কনকারেন্সি সমস্যা (Dirty, Non-repeatable, Phantom Read) সমাধান করে।
- অসুবিধা: এটি সিস্টেমকে ধীর করে দেয় কারণ ট্রানজেকশনগুলোকে একে অপরের জন্য অপেক্ষা করতে হয়।
Which isolation level does your database use by default?
Database-wise Default Isolation Levels:
| Database | Default Level | Can be Changed |
|---|---|---|
| MySQL InnoDB | REPEATABLE READ | ✅ Yes |
| PostgreSQL | READ COMMITTED | ✅ Yes |
| SQL Server | READ COMMITTED | ✅ Yes |
| Oracle | READ COMMITTED | ✅ Yes |
| SQLite | SERIALIZABLE | ❌ Limited |
55. What is dirty read?
Dirty read হলো ডাটাবেসের একটি concurrency problem, যা তখন ঘটে যখন একটি transaction এমন কিছু ডেটা পড়ে ফেলে যা অন্য একটি transaction পরিবর্তন করেছে কিন্তু এখনও Commit (স্থায়ীভাবে সেভ) করেনি।
সহজ কথায়, আপনি এমন একটি ডেটা দেখছেন যা ডাটাবেসে এখনও কাঁচা বা "অপরিষ্কার" (dirty), কারণ এটি যেকোনো মুহূর্তে বাতিল বা Rollback হয়ে যেতে পারে।
Dirty Read Example:
ধরুন, আপনার ব্যাংক অ্যাকাউন্টে ১,০০০ টাকা আছে। এখন দুটি transaction একসাথে ঘটছে:
- transaction A (টাকা জমা দিচ্ছে): এটি আপনার অ্যাকাউন্টে আরও ৫,০০০ টাকা যোগ করল। এখন ব্যালেন্স দেখাবে ৬,০০০ টাকা। কিন্তু ট্রানজেকশনটি এখনও Commit করেনি (অর্থাৎ চূড়ান্তভাবে সেভ হয়নি)।
- transaction B (ব্যালেন্স চেক করছে): এই অবস্থায় transaction B ব্যালেন্স চেক করল এবং দেখল ৬,০০০ টাকা আছে (এটিই Dirty Read)। এই তথ্যের ওপর ভিত্তি করে সে হয়তো আপনার একটি ৪,০০০ টাকার পেমেন্ট অ্যাপ্রুভ করে দিল।
- ফলাফল: হঠাৎ কোনো টেকনিক্যাল সমস্যার কারণে transaction A ফেইল করল এবং Rollback হয়ে গেল। আপনার ব্যালেন্স আবার আগের মতো ১,০০০ টাকায় ফিরে গেল।
সমস্যাটি কী হলো? transaction B এমন একটি ডেটার (৬,০০০ টাকা) ওপর ভিত্তি করে সিদ্ধান্ত নিয়েছে যার অস্তিত্বই এখন আর নেই। এর ফলে ডাটাবেসে ইনকনসিস্টেন্সি তৈরি হয়।
How can dirty reads be avoided?
Dirty Read বন্ধ করার প্রধান উপায় হলো ডাটাবেসের Isolation Level পরিবর্তন করা। নিচের লেভেলগুলো ব্যবহার করলে Dirty Read ঘটে না:
- READ COMMITTED: এটি নিশ্চিত করে যে একটি transaction কেবল তখনই ডেটা পড়তে পারবে যখন তা অন্য transaction দ্বারা সফলভাবে Commit হবে।
- REPEATABLE READ: এটি রো-লেভেলে লক ব্যবহার করে ডেটার নির্ভুলতা নিশ্চিত করে।
- SERIALIZABLE: এটি সর্বোচ্চ নিরাপত্তা দেয় এবং সব ধরণের রিড এরর প্রতিরোধ করে।
অধিকাংশ আধুনিক ডাটাবেস (যেমন- SQL Server, PostgreSQL, Oracle) ডিফল্টভাবেই Read Committed আইসোলেশন লেভেল ব্যবহার করে, যাতে Dirty Read না ঘটে। তবে MySQL এর কিছু কনফিগারেশনে এটি ম্যানুয়ালি চেক করতে হতে পারে।
Which isolation levels prevent dirty reads?
| Isolation Level | Prevents Dirty Reads | Example |
|---|---|---|
| READ UNCOMMITTED | ❌ No | SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; |
| READ COMMITTED | ✅ Yes | SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
| REPEATABLE READ | ✅ Yes | SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
| SERIALIZABLE | ✅ Yes | SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
Performance vs Consistency Trade-off:
READ UNCOMMITTED (Allows Dirty Reads):
- ✅ Pros: Highest performance, no locking overhead
- ❌ Cons: Data inconsistency, unreliable results
READ COMMITTED (Prevents Dirty Reads):
- ✅ Pros: Good balance of performance and consistency
- ❌ Cons: Slight performance overhead due to locking
56. What is non-repeatable read?
Non-repeatable read হলো এমন একটি ডেটাবেস সমস্যা যেখানে একটি ট্রানজেকশনের ভেতরে একই ডেটা দুইবার পড়লে দুইবার দুই রকম রেজাল্ট পাওয়া যায়।
এটি সাধারণত READ COMMITTED আইসোলেশন লেভেলে ঘটে। যখন একটি transaction চলাকালীন অন্য একটি transaction ওই একই ডেটা পরিবর্তন (Update) করে Commit করে দেয়, তখনই এই সমস্যাটি দেখা দেয়।
Non-repeatable Read Example:
ধরুন, একটি ব্যাংকিং সিস্টেমে নিচের ধাপগুলো ঘটছে:
- transaction A (ইউজার): আপনি আপনার অ্যাকাউন্টের ব্যালেন্স চেক করলেন। কুয়েরি দেখালো আপনার ব্যালেন্স ৫,০০০ টাকা।
- transaction B (সিস্টেম): ঠিক ওই মুহূর্তেই আপনার একটি অটো-ডেবিট (যেমন: নেটফ্লিক্স সাবস্ক্রিপশন) প্রসেস হলো এবং ৫০০ টাকা কেটে নিয়ে ট্রানজেকশনটি Commit হলো। এখন প্রকৃত ব্যালেন্স ৪,৫০০ টাকা।
- transaction A (ইউজার): ট্রানজেকশনটি এখনো শেষ হয়নি। আপনি একই স্ক্রিনে থাকা অবস্থায় আবার 'Refresh' বা রি-চেক করলেন। এবার কুয়েরি দেখালো আপনার ব্যালেন্স ৪,৫০০ টাকা।
সমস্যাটি কী? transaction A-এর কাছে মনে হবে ডেটা ইনকনসিস্টেন্ট, কারণ একই ট্রানজেকশনের ভেতরে সে একবার দেখল ৫,০০০ আর একটু পরেই দেখল ৪,৫০০।
How is it different from dirty read?
অনেকে Dirty Read এবং Non-repeatable Read গুলিয়ে ফেলেন। মূল পার্থক্য হলো:
- Dirty Read: আপনি এমন ডেটা পড়ছেন যা অন্য কেউ পরিবর্তন করেছে কিন্তু এখনো