Transactions এবং Concurrency Control PostgreSQL-এ ডেটাবেস পরিচালনার গুরুত্বপূর্ণ উপাদান। এগুলি ডেটার সঠিকতা এবং নিরাপত্তা নিশ্চিত করতে ব্যবহৃত হয়, বিশেষত একাধিক ব্যবহারকারী যখন একে অপরের সাথে সমান্তরালে কাজ করে। PostgreSQL ডেটাবেসে ACID (Atomicity, Consistency, Isolation, Durability) গ্যারান্টি প্রদান করে, যা টেকসই ট্রানজেকশন এবং কনকারেন্সি কন্ট্রোল নিশ্চিত করে।
1. Transactions in PostgreSQL (ট্রানজেকশন)
Transaction হল ডেটাবেসে এক বা একাধিক SQL কুয়েরির একটি গ্রুপ যা একসাথে সম্পাদিত হয়। ট্রানজেকশন চলাকালীন, সব অপারেশন একযোগভাবে সফল না হলে কিছুই পরিবর্তিত হয় না। এটি ACID বৈশিষ্ট্য অনুযায়ী কাজ করে, যা ডেটার অখণ্ডতা এবং সঠিকতা নিশ্চিত করে।
ট্রানজেকশন শুরু করা
ট্রানজেকশন শুরু করতে BEGIN কমান্ড ব্যবহার করা হয়। এটি একটি নতুন ট্রানজেকশন শুরু করবে।
BEGIN;
ট্রানজেকশন কমপ্লিট করা (Commit)
যখন আপনি নিশ্চিত হন যে ট্রানজেকশন সফলভাবে সম্পন্ন হয়েছে এবং পরিবর্তনগুলো ডেটাবেসে সেভ করতে চান, তখন COMMIT কমান্ড ব্যবহার করা হয়।
COMMIT;
ট্রানজেকশন রিভার্ট করা (Rollback)
যদি ট্রানজেকশন চলাকালীন কোনো ত্রুটি ঘটে বা আপনি পরিবর্তনগুলো বাতিল করতে চান, তবে ROLLBACK কমান্ড ব্যবহার করা হয়। এটি সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনবে।
ROLLBACK;
ট্রানজেকশনের উদাহরণ
BEGIN;
UPDATE users SET email = 'john.doe@example.com' WHERE id = 1;
INSERT INTO orders (user_id, order_date) VALUES (1, '2024-11-25');
COMMIT;
এখানে, UPDATE এবং INSERT দুটি অপারেশন একসাথে একটি ট্রানজেকশনের মধ্যে সম্পাদিত হবে। যদি কোনো ত্রুটি ঘটে, তাহলে ROLLBACK দ্বারা সমস্ত পরিবর্তন ফিরিয়ে আনা যাবে।
2. Concurrency Control (কনকারেন্সি কন্ট্রোল)
Concurrency Control হল সেই প্রযুক্তি যা নিশ্চিত করে যে একাধিক ইউজার বা প্রসেস একসাথে ডেটাবেসে কাজ করার সময় ডেটার অখণ্ডতা বজায় থাকে। PostgreSQL-এ MVCC (Multi-Version Concurrency Control) ব্যবহার করা হয়, যা ডেটা অ্যাক্সেসকে সমান্তরালে পরিচালনা করতে সহায়তা করে, এবং একাধিক ইউজারের ডেটার সাথে কোনো দ্বন্দ্ব বা কনফ্লিক্ট ছাড়াই সঠিকভাবে কাজ করতে সক্ষম করে।
MVCC (Multi-Version Concurrency Control)
PostgreSQL-এ MVCC ব্যবহৃত হয়, যা একাধিক ইউজারকে একই সময়ে ডেটাবেসে কাজ করতে দেয়, তবে তারা একে অপরের পরিবর্তনকে ব্লক বা প্রভাবিত না করে। MVCC প্রত্যেকটি ডেটা পৃষ্ঠার জন্য একাধিক ভার্সন রাখতে সাহায্য করে, যাতে একটি ট্রানজেকশন চলাকালে অন্য ট্রানজেকশনগুলি সেই ডেটাকে দেখতে পারে না যতক্ষণ না তার কার্যক্রম শেষ হয়।
MVCC-এর মাধ্যমে ট্রানজেকশনগুলি:
- Isolation বজায় রাখে।
- একই রেকর্ডের জন্য একাধিক ভার্সন তৈরি হয়, যাতে একজন ব্যবহারকারী একজন রেকর্ডে পরিবর্তন করলে অন্য ব্যবহারকারীরা পুরানো ডেটা দেখতে পারে।
Transaction Isolation Levels (আইসোলেশন লেভেল)
PostgreSQL বিভিন্ন transaction isolation levels সমর্থন করে, যা কনকারেন্সি কন্ট্রোলের শক্তি এবং ট্রানজেকশনের প্রভাব নির্ধারণ করে। PostgreSQL নিম্নলিখিত 4টি isolation levels সমর্থন করে:
- Read Uncommitted:
- একটি ট্রানজেকশন অপর একটি ট্রানজেকশনের অপরিবর্তিত ডেটা দেখতে পারে (dirty reads)। PostgreSQL এ এই লেভেলটি সাপোর্ট করা হয় না, তবে অন্য ডেটাবেসে এটি উপলব্ধ।
- Read Committed:
- একটি ট্রানজেকশন শুধুমাত্র অন্য ট্রানজেকশন দ্বারা commit হওয়া ডেটা দেখতে পারে। এটি PostgreSQL এর ডিফল্ট আইসোলেশন লেভেল।
- Repeatable Read:
- ট্রানজেকশনের মধ্যে যেসব ডেটা একবার পড়া হয়েছে, সেই ডেটা পরে কোনো পরিবর্তন হতে পারবে না। অর্থাৎ, পূর্বে পড়া ডেটার সাথে পরবর্তী পড়া ডেটা এক হবে। তবে, Phantom Reads এড়ানো যায় না।
- Serializable:
- এটি সর্বোচ্চ আইসোলেশন লেভেল, যেখানে একটি ট্রানজেকশন সম্পূর্ণরূপে এককভাবে কাজ করে এবং অন্য ট্রানজেকশনের সাথে কোনো ধরনের কনফ্লিক্ট হতে পারে না। এটি পারফরম্যান্স কমাতে পারে তবে সর্বোচ্চ ডেটা সঠিকতা প্রদান করে।
Isolation Level সেট করা
PostgreSQL-এ ট্রানজেকশনের আইসোলেশন লেভেল পরিবর্তন করতে SET TRANSACTION ISOLATION LEVEL কমান্ড ব্যবহার করা হয়।
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
-- টেবিলের অপারেশন
COMMIT;
3. Locking (লকিং)
PostgreSQL-এ কনকারেন্সি কন্ট্রোলের অংশ হিসেবে লকিং ব্যবহৃত হয়, যা ডেটার নিরাপত্তা নিশ্চিত করে, বিশেষত যখন একাধিক ট্রানজেকশন একই ডেটা পরিবর্তন করতে চায়। PostgreSQL-এ দুটি প্রধান ধরনের লক ব্যবহৃত হয়:
- Row-level Locks:
- এটি শুধুমাত্র নির্দিষ্ট রেকর্ড বা রোতে লক প্রয়োগ করে, যাতে একাধিক ট্রানজেকশন একই টেবিলের বিভিন্ন রেকর্ডে কাজ করতে পারে।
উদাহরণ:
SELECT * FROM users WHERE id = 1 FOR UPDATE;
- Table-level Locks:
- এটি পুরো টেবিলের উপর লক প্রয়োগ করে, যা অন্য ট্রানজেকশনকে একই টেবিলের উপর কাজ করতে বাধা দেয়।
উদাহরণ:
LOCK TABLE users IN SHARE MODE;
সারাংশ
- Transactions PostgreSQL-এ ডেটাবেসে এক বা একাধিক অপারেশন একত্রে সম্পাদিত হয়। BEGIN, COMMIT, এবং ROLLBACK এর মাধ্যমে ট্রানজেকশন পরিচালিত হয়।
- Concurrency Control হল সমান্তরালে চলমান ট্রানজেকশনের মধ্যে ডেটার নিরাপত্তা এবং সঠিকতা নিশ্চিত করার প্রক্রিয়া। PostgreSQL-এ MVCC ব্যবহার করা হয় যা একাধিক ট্রানজেকশনকে সমান্তরালে চলতে সাহায্য করে।
- Isolation Levels বিভিন্ন ট্রানজেকশন আইসোলেশন নিশ্চিত করে এবং PostgreSQL ৪টি isolation level সমর্থন করে: Read Committed, Repeatable Read, Serializable।
- Locking ডেটা নিরাপত্তা বজায় রাখতে সাহায্য করে যখন একাধিক ট্রানজেকশন একই ডেটার উপর কাজ করতে চায়।
Transaction এবং ACID Properties হল ডেটাবেস সিস্টেমের গুরুত্বপূর্ণ অংশ যা ডেটাবেসের ডেটা এক্সিকিউশন, নিরাপত্তা, এবং স্থিরতা নিশ্চিত করে। একটি Transaction ডেটাবেসের মধ্যে এক বা একাধিক অপারেশনকে একটি ইউনিট হিসেবে পরিচালনা করে, এবং ACID Properties হল সেই সমস্ত গুণাবলী যা নিশ্চিত করে যে ট্রানজেকশনটি সঠিকভাবে সম্পন্ন হয় এবং ডেটাবেসের অখণ্ডতা বজায় থাকে।
1. Transaction কী?
Transaction একটি সম্পূর্ণ ডেটাবেস অপারেশন যা একাধিক SQL স্টেটমেন্ট বা কার্যক্রমের সমন্বয়ে গঠিত হতে পারে। একটি ট্রানজেকশন শুরু হতে পারে যখন একটি SQL কুয়েরি চালানো হয় এবং এটি শেষ হয় যখন সমস্ত কুয়েরি সফলভাবে সম্পন্ন হয় বা যদি কোন সমস্যা হয় তবে পরিবর্তনগুলি ফিরিয়ে নেয়া হয়।
এটি ডেটাবেসে অযাচিত বা অসম্পূর্ণ পরিবর্তন এড়াতে এবং ডেটার অখণ্ডতা বজায় রাখতে সহায়তা করে। একটি ট্রানজেকশন হয় সম্পূর্ণরূপে সফল অথবা সম্পূর্ণরূপে ব্যর্থ, কখনোই আংশিকভাবে সফল হতে পারে না।
ট্রানজেকশন এর উদাহরণ:
ধরা যাক, একটি ব্যাংক অ্যাকাউন্ট থেকে টাকা ট্রান্সফার করা হচ্ছে। এই প্রক্রিয়ায় দুটি অপারেশন ঘটবে:
- একটি অ্যাকাউন্ট থেকে টাকা কাটা।
- অন্য অ্যাকাউন্টে টাকা যোগ করা।
এটি একটি ট্রানজেকশন হিসেবে গণ্য হবে। যদি কোনো কারণে প্রথম অপারেশন সফল হয় কিন্তু দ্বিতীয় অপারেশন ব্যর্থ হয়, তাহলে ডেটা অসঙ্গতিপূর্ণ হয়ে যাবে। এর সমাধান হলো ট্রানজেকশন ব্যবস্থাপনা, যা পুরো প্রক্রিয়াটি একসাথে বা একেবারে বাতিল করে।
2. ACID Properties
ACID হল চারটি গুণাবলী যা একটি ট্রানজেকশনকে সফলভাবে এবং নির্ভরযোগ্যভাবে পরিচালনা করতে সাহায্য করে:
- A: Atomicity
- C: Consistency
- I: Isolation
- D: Durability
A: Atomicity (আটমিকতা)
Atomicity নিশ্চিত করে যে একটি ট্রানজেকশন সম্পূর্ণরূপে সফল বা সম্পূর্ণরূপে ব্যর্থ হবে। অর্থাৎ, ট্রানজেকশনটি একক ইউনিট হিসেবে কাজ করবে, এবং এর মধ্যে কোনো অপারেশন ব্যর্থ হলে পুরো ট্রানজেকশনটি বাতিল হয়ে যাবে (rollback)।
- উদাহরণ: যদি একটি ব্যাংক অ্যাকাউন্ট থেকে টাকা ট্রান্সফার করা হয় এবং প্রথম অপারেশন সফল হয় কিন্তু দ্বিতীয় অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজেকশনটি বাতিল করা হবে এবং প্রথম অ্যাকাউন্টে টাকা পুনরুদ্ধার করা হবে।
C: Consistency (সঙ্গতি)
Consistency নিশ্চিত করে যে একটি ট্রানজেকশন শুরুর আগে এবং পরে ডেটাবেসের সঠিক অবস্থা বজায় থাকবে। কোনো ট্রানজেকশন ডেটাবেসের অখণ্ডতা ভঙ্গ করতে পারবে না।
- উদাহরণ: ব্যাংক অ্যাকাউন্টে টাকা ট্রান্সফারের সময় যদি এক অ্যাকাউন্টে টাকা কাটা হয়, তাহলে অবশ্যই সেই পরিমাণ টাকা অন্য অ্যাকাউন্টে জমা হতে হবে, এবং কোনো অ্যাকাউন্টে ব্যালান্সের অভাব ঘটবে না।
I: Isolation (অধিকারীতা)
Isolation নিশ্চিত করে যে একটি ট্রানজেকশন চলাকালীন অন্য কোনো ট্রানজেকশন তার উপর প্রভাব ফেলবে না। একাধিক ট্রানজেকশন একসাথে চললেও, প্রত্যেকটি ট্রানজেকশন আলাদা এবং স্বাধীনভাবে কাজ করবে।
- উদাহরণ: এক অ্যাকাউন্ট থেকে টাকা কাটা এবং অন্য অ্যাকাউন্টে জমা করা চলাকালীন, অন্য কোনো ট্রানজেকশন যদি একই অ্যাকাউন্টে টাকা জমা বা উত্তোলন করতে চেষ্টা করে, তবে একে অপরের ওপর প্রভাব ফেলবে না এবং তাদের কাজ শেষ হওয়ার আগে কোনো ডেটা পরিবর্তন হবে না।
D: Durability (স্থিতিস্থাপকতা)
Durability নিশ্চিত করে যে একটি ট্রানজেকশন সফলভাবে সম্পন্ন হলে, তার ফলাফল ডেটাবেসে স্থায়ীভাবে সঞ্চিত হবে এবং সিস্টেম ক্র্যাশ বা পাওয়ার বিপর্যয়ের পরেও তা হারাবে না।
- উদাহরণ: যদি একটি ট্রানজেকশন সফলভাবে সম্পন্ন হয় (যেমন টাকা ট্রান্সফার), তবে এটি নিশ্চিত করা হবে যে সেই পরিবর্তনগুলো ডেটাবেসে স্থায়ীভাবে থাকবে, এমনকি সিস্টেম বন্ধ হয়ে যাওয়ার পরেও।
3. PostgreSQL এ Transactions
PostgreSQL এ ট্রানজেকশন পরিচালনা করতে নিম্নলিখিত SQL কমান্ডগুলো ব্যবহার করা হয়:
a. BEGIN TRANSACTION
ট্রানজেকশন শুরু করার জন্য।
উদাহরণ:
BEGIN;
b. COMMIT
ট্রানজেকশন সফলভাবে শেষ হলে সমস্ত পরিবর্তন ডেটাবেসে স্থায়ী করার জন্য।
উদাহরণ:
COMMIT;
c. ROLLBACK
যদি কোনো সমস্যা হয় বা ট্রানজেকশন ব্যর্থ হয়, তাহলে সমস্ত পরিবর্তন বাতিল করতে ব্যবহার করা হয়।
উদাহরণ:
ROLLBACK;
সারাংশ
- Transaction হল একাধিক SQL অপারেশনের একটি ইউনিট যা সফলভাবে সম্পন্ন হয় অথবা সম্পূর্ণভাবে বাতিল হয়ে যায়। এটি ডেটাবেসের তথ্যের সঠিকতা এবং অখণ্ডতা বজায় রাখতে সাহায্য করে।
- ACID Properties হল চারটি গুণাবলী: Atomicity, Consistency, Isolation, এবং Durability, যা ট্রানজেকশন সঠিকভাবে পরিচালিত হওয়ার জন্য প্রয়োজনীয়।
- PostgreSQL এবং অন্যান্য RDBMS এ ট্রানজেকশন ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করে যে ডেটাবেসের ডেটা সঠিক, সঙ্গতিপূর্ণ এবং নিরাপদ থাকবে।
PostgreSQL-এ COMMIT, ROLLBACK, এবং SAVEPOINT ডেটাবেস ট্রানজেকশন পরিচালনার জন্য ব্যবহৃত হয়। এগুলি ডেটাবেসের নিরাপত্তা, এক্সিকিউশন এবং তথ্য সংরক্ষণ নিশ্চিত করতে ব্যবহৃত হয়। ট্রানজেকশন ব্যবস্থাপনা ACID (Atomicity, Consistency, Isolation, Durability) প্রিন্সিপল অনুযায়ী কাজ করে।
1. COMMIT
COMMIT কুয়েরি ব্যবহার করা হয় যখন আপনি একটি ট্রানজেকশন সফলভাবে সম্পন্ন করেছেন এবং সমস্ত পরিবর্তন ডেটাবেসে স্থায়ীভাবে সংরক্ষণ করতে চান।
COMMIT এর সাধারণ সঠিক গঠন:
COMMIT;
যখন আপনি COMMIT কুয়েরি চালান, তখন আপনার সমস্ত কার্যক্রম (যেমন INSERT, UPDATE, DELETE) ডেটাবেসে স্থায়ীভাবে সেভ হয়ে যায় এবং সেই মুহূর্ত থেকে ডেটাবেসের অবস্থা পরিবর্তিত হয়ে থাকে।
উদাহরণ:
BEGIN; -- ট্রানজেকশন শুরু
UPDATE employees SET salary = 55000 WHERE id = 1;
INSERT INTO employees (name, salary) VALUES ('John Doe', 60000);
COMMIT; -- সব পরিবর্তন স্থায়ী করা
এই উদাহরণে, আপনি প্রথমে একটি ট্রানজেকশন শুরু করেছেন, এরপর একটি আপডেট এবং একটি ইনসার্ট করেছেন। অবশেষে, COMMIT কুয়েরি চালানোর মাধ্যমে এই পরিবর্তনগুলি স্থায়ীভাবে ডেটাবেসে সংরক্ষিত হবে।
2. ROLLBACK
ROLLBACK কুয়েরি ব্যবহৃত হয় ট্রানজেকশনের পরিবর্তনগুলি প্রত্যাহার (undo) করার জন্য। এটি ব্যবহার করা হয় যখন আপনি কোনো ত্রুটি বা সমস্যা সনাক্ত করেন এবং আপনি যে সমস্ত পরিবর্তন করেছেন তা ফিরিয়ে নিতে চান। এর মাধ্যমে আপনি ডেটাবেসে কোনো পরিবর্তন না ঘটিয়ে পূর্বের অবস্থায় ফিরে যেতে পারেন।
ROLLBACK এর সাধারণ সঠিক গঠন:
ROLLBACK;
উদাহরণ:
BEGIN; -- ট্রানজেকশন শুরু
UPDATE employees SET salary = 55000 WHERE id = 1;
INSERT INTO employees (name, salary) VALUES ('John Doe', 60000);
ROLLBACK; -- সব পরিবর্তন প্রত্যাহার করা
এই উদাহরণে, ROLLBACK কুয়েরি চালানোর পর, salary আপডেট এবং নতুন কর্মচারী ইনসার্টের সমস্ত পরিবর্তন বাতিল হয়ে যাবে এবং ডেটাবেস আগের অবস্থায় ফিরে যাবে।
3. SAVEPOINT
SAVEPOINT কুয়েরি ব্যবহার করা হয় ট্রানজেকশনের মধ্যে একটি বিশেষ মাইলস্টোন বা চেকপয়েন্ট তৈরি করার জন্য। আপনি যখন SAVEPOINT তৈরি করেন, তখন আপনি নির্দিষ্ট একটি বিন্দুতে ফিরে যেতে পারবেন যদি কোনো ত্রুটি ঘটে বা যদি আপনি চান, তখন আপনি ROLLBACK TO SAVEPOINT ব্যবহার করে সেই পয়েন্টে ফিরে যেতে পারেন।
SAVEPOINT এর সাধারণ সঠিক গঠন:
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT:
ROLLBACK TO SAVEPOINT savepoint_name;
উদাহরণ:
BEGIN; -- ট্রানজেকশন শুরু
-- প্রথম SAVEPOINT তৈরি
SAVEPOINT sp1;
UPDATE employees SET salary = 55000 WHERE id = 1;
-- দ্বিতীয় SAVEPOINT তৈরি
SAVEPOINT sp2;
INSERT INTO employees (name, salary) VALUES ('John Doe', 60000);
-- কোনো সমস্যা হলে দ্বিতীয় SAVEPOINT থেকে ফিরে যেতে পারেন
ROLLBACK TO SAVEPOINT sp2; -- sp2 থেকে ফিরে যাওয়ার পর ইনসার্ট অপারেশন বাতিল হবে
COMMIT; -- শুধুমাত্র প্রথম UPDATE স্থায়ী হবে
এই উদাহরণে:
- প্রথমে একটি ট্রানজেকশন শুরু করা হয়।
- এরপর SAVEPOINT তৈরি করে একটি আপডেট অপারেশন করা হয়।
- দ্বিতীয় SAVEPOINT তৈরি করার পর একটি ইনসার্ট অপারেশন করা হয়।
- ROLLBACK TO SAVEPOINT sp2 চালানোর মাধ্যমে, ইনসার্ট অপারেশনটি বাতিল করা হয়, তবে প্রথম আপডেট টিকেই থাকে।
- শেষে COMMIT ব্যবহার করে পরিবর্তনগুলি স্থায়ী করা হয়।
সারাংশ
- COMMIT: ট্রানজেকশন সফলভাবে শেষ হলে ডেটাবেসে পরিবর্তনগুলি স্থায়ী করতে ব্যবহৃত হয়।
- ROLLBACK: ট্রানজেকশন চলাকালীন কোনো ত্রুটি ঘটলে সমস্ত পরিবর্তন বাতিল করে ডেটাবেসকে পূর্বাবস্থায় ফিরিয়ে নিয়ে আসে।
- SAVEPOINT: ট্রানজেকশনে একটি চেকপয়েন্ট তৈরি করে, যেখানে আপনি প্রয়োজন হলে ফিরে যেতে পারেন। এটি একটি গুরুত্বপূর্ণ টুল যখন আপনি বড় এবং জটিল ট্রানজেকশন পরিচালনা করছেন।
এই তিনটি কুয়েরি, COMMIT, ROLLBACK, এবং SAVEPOINT, PostgreSQL ট্রানজেকশন ব্যবস্থাপনাকে খুবই শক্তিশালী ও নির্ভরযোগ্য করে তোলে।
Transaction Isolation Levels হল ডেটাবেস ট্রানজেকশনের আচরণ এবং বিভিন্ন ট্রানজেকশনগুলির মধ্যে ইন্টারঅ্যাকশন কীভাবে হবে তা নির্ধারণ করে। PostgreSQL ACID (Atomicity, Consistency, Isolation, Durability) প্রপার্টিজ মেনে চলে এবং Transaction Isolation Levels নিশ্চিত করে যে একাধিক ট্রানজেকশন একে অপরকে প্রভাবিত না করে নিরাপদে সম্পাদিত হয়। PostgreSQL মোট চারটি isolation level সমর্থন করে:
১. READ UNCOMMITTED
- Description: এই isolation level এ একটি ট্রানজেকশন অন্য ট্রানজেকশনের অকমিটেড (অধরা) ডেটা পড়তে পারে। এটিকে "dirty read" বলা হয়, কারণ একটি ট্রানজেকশন অপর একটি ট্রানজেকশনের পরিবর্তন পড়ে, যদিও এটি কমিট হয়নি।
Use Case: সাধারণত এটি নিরাপদ নয় এবং খুব কম ব্যবহৃত হয়, কারণ এটি ডেটার অখণ্ডতা বজায় রাখতে পারে না।
Example:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;Issues:
- Dirty Reads: আপনি এমন ডেটা পড়তে পারেন যা পরবর্তীতে রোলব্যাক করা হতে পারে।
২. READ COMMITTED
- Description: এটি PostgreSQL এর ডিফল্ট isolation level। এখানে, একটি ট্রানজেকশন শুধুমাত্র কমিট হওয়া ডেটা পড়তে পারে। যদি একটি ট্রানজেকশন চলমান অবস্থায় অন্য একটি ট্রানজেকশন ডেটা পরিবর্তন করে, তবে প্রথম ট্রানজেকশন পরবর্তীতে সেই পরিবর্তিত ডেটা দেখতে পাবে।
Use Case: অধিকাংশ সাধারণ ডেটাবেস কাজের জন্য এটি যথেষ্ট নিরাপদ এবং এটি সাধারণত ব্যবহৃত হয়।
Example:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;Issues:
- Non-repeatable Reads: একই কুয়েরি একাধিক বার চালানোর সময় ফলাফল পরিবর্তিত হতে পারে (যতক্ষণ না ট্রানজেকশন কমিট হয়)।
৩. REPEATABLE READ
- Description: এই isolation level এ, একবার একটি ট্রানজেকশন যেকোনো ডেটা পড়লে, সেই ডেটার মধ্যে কোনো পরিবর্তন পরবর্তী ট্রানজেকশনে দেখা যাবে না, যতক্ষণ না তা কমিট হয়। অর্থাৎ, একই কুয়েরি বারবার চালালেও ফলাফল এক রকম থাকবে।
Use Case: এটি একাধিক কনকারেন্ট ট্রানজেকশন এর মধ্যে consistency বজায় রাখতে উপকারী, যেখানে আপনি চান ডেটা একাধিকবার পড়ার সময় তা অপরিবর্তিত থাকবে।
Example:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Issues:
- Phantom Reads: একই সিলেক্ট কুয়েরি একটি ট্রানজেকশনে পরবর্তী সময়ে নতুন রেকর্ড যুক্ত হলে, তা ওই ট্রানজেকশনে প্রভাব ফেলতে পারে।
৪. SERIALIZABLE
- Description: এটি সবচেয়ে কঠোর isolation level। এখানে ট্রানজেকশনগুলি এমনভাবে সম্পাদিত হয় যেন তারা পরস্পরের মধ্যে একে অপরের ফলাফলের সাথে ইন্টারফেয়ার না করে। প্রতিটি ট্রানজেকশন পরস্পর থেকে বিচ্ছিন্নভাবে কাজ করে, এবং তাদের ফলাফল যেন সিরিয়ালি সম্পাদিত হয়েছে, এমন দেখায়।
Use Case: এটি সবচেয়ে সঠিক ডেটা consistency প্রদান করে এবং যেখানে অ্যাপ্লিকেশন বা সিস্টেমের জন্য ডেটার সর্বোচ্চ নির্ভুলতা প্রয়োজন, সেখানে এটি ব্যবহার করা হয়।
Example:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;Issues:
- Performance Overhead: এটা অন্য isolation level এর তুলনায় অনেক ধীর হতে পারে, কারণ এটি সম্পূর্ণভাবে ট্রানজেকশন গুলিকে সিরিয়ালাইজ করে। এতে ডেডলক (deadlock) বা অপেক্ষা (waiting) আরও বেশি হতে পারে।
৫. Isolation Levels এর মধ্যে পার্থক্য
| Isolation Level | Dirty Reads | Non-repeatable Reads | Phantom Reads | Performance | Use Case |
|---|---|---|---|---|---|
| READ UNCOMMITTED | Allowed | Allowed | Allowed | Fast | সাধারণত ব্যবহৃত নয়, কম প্রোডাক্টিভ সিস্টেমে ব্যবহার হতে পারে। |
| READ COMMITTED | Not Allowed | Allowed | Allowed | Good | সাধারণ ওয়েব অ্যাপ্লিকেশন, ট্রানজেকশনাল সিস্টেমে ব্যবহৃত। |
| REPEATABLE READ | Not Allowed | Not Allowed | Allowed | Moderate | ট্রানজেকশনে ডেটার consistency বজায় রাখতে ব্যবহৃত। |
| SERIALIZABLE | Not Allowed | Not Allowed | Not Allowed | Slow | সর্বোচ্চ ডেটা consistency প্রয়োজন এমন সিস্টেমে ব্যবহার করা হয়। |
৬. চয়ন করার সময় কি বিবেচনা করবেন?
- Performance vs Consistency: যদি আপনি একটি পারফরম্যান্স-অধিক অ্যাপ্লিকেশন তৈরি করছেন এবং আপনি ছোট ডেটাসেট নিয়ে কাজ করছেন, তাহলে READ COMMITTED বা READ UNCOMMITTED উপযুক্ত হতে পারে। তবে, যদি ডেটা consistency অত্যন্ত গুরুত্বপূর্ণ হয় (যেমন ফাইন্যান্সিয়াল ট্রানজেকশন), তখন SERIALIZABLE নির্বাচন করা উচিত।
- Data Integrity: SERIALIZABLE এর মাধ্যমে আপনি নিশ্চিত হতে পারবেন যে ট্রানজেকশনগুলির মধ্যে কোনো অপ্রত্যাশিত পরিবর্তন ঘটবে না।
সারাংশ
PostgreSQL এ Transaction Isolation Levels ডেটাবেসে একাধিক ট্রানজেকশন পরিচালনার পদ্ধতি এবং তাদের মধ্যে সম্পর্ক কীভাবে হবে তা নিয়ন্ত্রণ করে। READ UNCOMMITTED থেকে SERIALIZABLE পর্যন্ত, প্রতিটি isolation level ডেটা consistency এবং পারফরম্যান্সের মধ্যে একটি ব্যালান্স স্থাপন করে। আপনার প্রয়োজনে সঠিক isolation level নির্বাচন করে আপনি ডেটাবেসের কার্যকারিতা এবং নির্ভরযোগ্যতা নিশ্চিত করতে পারবেন।
Concurrency এবং Locking Mechanisms PostgreSQL বা অন্য কোনও ডেটাবেস সিস্টেমের মধ্যে ডেটার সঠিকতা এবং একাধিক ইউজারের মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণের জন্য অত্যন্ত গুরুত্বপূর্ণ। এই দুটি ধারণা একে অপরের সাথে সম্পর্কিত এবং ডেটাবেসে একাধিক ট্রানজেকশন চলতে থাকা অবস্থায় সঠিকভাবে ডেটা পরিচালনা করা নিশ্চিত করে।
1. Concurrency in PostgreSQL
Concurrency হল একাধিক ট্রানজেকশন একই সময়ে ডেটাবেসে প্রবেশ এবং ডেটা নিয়ে কাজ করার প্রক্রিয়া। PostgreSQL এর MVCC (Multi-Version Concurrency Control) প্রযুক্তি ব্যবহার করে, যেখানে একাধিক ট্রানজেকশন একই ডেটা পণ্যে কাজ করতে পারে কিন্তু একে অপরের প্রভাব থেকে বিচ্ছিন্ন থাকে।
MVCC এর কাজ করার পদ্ধতি:
- যখন কোনো ট্রানজেকশন ডেটার কোনও অংশে পরিবর্তন করে, তখন PostgreSQL পুরনো ডেটার একটি কপি সংরক্ষণ করে এবং নতুন সংস্করণ তৈরি করে।
- একাধিক ট্রানজেকশন যখন একই রেকর্ডে কাজ করে, তখন PostgreSQL তাদের মধ্যে পার্থক্য রেখে ডেটা পেশ করে এবং প্রতিটি ট্রানজেকশনকে আলাদা ভার্সনে সংরক্ষণ করে, যার ফলে তারা একে অপরকে প্রভাবিত করে না।
- MVCC ট্রানজেকশনগুলোকে Isolation মানের মধ্যে রেখে একে অপরের প্রভাব থেকে রক্ষা করে।
Concurrency এর উদাহরণ:
ধরা যাক, দুটি ট্রানজেকশন একই সময়ে একটি টেবিলের রেকর্ড আপডেট করছে। PostgreSQL তাদের আলাদা আলাদা ভার্সন তৈরি করবে এবং একে অপরের কাজের ওপর প্রভাব ফেলবে না, যতক্ষণ না একটি ট্রানজেকশন সম্পন্ন না হয়।
2. Locking Mechanisms in PostgreSQL
Locking হলো একাধিক ট্রানজেকশনের মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণের প্রক্রিয়া। PostgreSQL বিভিন্ন ধরণের লক ব্যবহার করে, যাতে একাধিক ট্রানজেকশন একে অপরের প্রভাব থেকে মুক্ত থাকে এবং ডেটাবেসের একাধিক অংশে কাজ করার সময় সঠিকতা বজায় থাকে।
PostgreSQL এ লকিং এর ধরন:
Row-Level Locking (লাইনের স্তরে লক):
- যখন কোনো ট্রানজেকশন একাধিক রেকর্ড আপডেট বা ডিলিট করতে চায়, তখন Row-Level Locking ব্যবহার করা হয়।
- এই লকটি নির্দিষ্ট একটি রেকর্ড বা রো-এ একমাত্র ট্রানজেকশনকে পরিবর্তন করতে দেয়। অন্য ট্রানজেকশন তখন সেই রেকর্ডে অ্যাক্সেস করতে পারবে না যতক্ষণ না প্রথম ট্রানজেকশন শেষ হয়।
- FOR UPDATE কুয়েরি ব্যবহার করলে PostgreSQL ওই রোটি লক করে রাখে।
উদাহরণ:
BEGIN; SELECT * FROM users WHERE id = 1 FOR UPDATE; UPDATE users SET status = 'active' WHERE id = 1; COMMIT;Table-Level Locking (টেবিল স্তরের লক):
- যখন পুরো টেবিলের ওপর লক প্রয়োজন, তখন Table-Level Locking ব্যবহার করা হয়। এটি সম্পূর্ণ টেবিলের উপর অ্যাক্সেস নিষিদ্ধ করে রাখে যাতে কোনও ট্রানজেকশন অন্য ট্রানজেকশনের কাজ সম্পন্ন না হওয়া পর্যন্ত অ্যাক্সেস না পায়।
- এটি সাধারণত LOCK TABLE কুয়েরি ব্যবহার করে করা হয়।
উদাহরণ:
BEGIN; LOCK TABLE users IN EXCLUSIVE MODE; UPDATE users SET status = 'active' WHERE id = 1; COMMIT;Shared Lock:
- Shared Lock (যেমন FOR SHARE) অন্য ট্রানজেকশনের জন্য রো পড়া বা নির্বাচনের অনুমতি দেয়, তবে লেখার জন্য অনুমতি দেয় না। একাধিক ট্রানজেকশন একই রোতে Shared Lock রাখতে পারে, তবে রোতে কোনো আপডেট বা ডিলিট করা যাবে না।
উদাহরণ:
BEGIN; SELECT * FROM users WHERE city = 'Dhaka' FOR SHARE; COMMIT;- Exclusive Lock:
- Exclusive Lock একমাত্র একটি ট্রানজেকশনকে নির্দিষ্ট রেকর্ডে সম্পূর্ণ নিয়ন্ত্রণ দেয়, অন্য কোনো ট্রানজেকশন তখন এই রেকর্ডে কোনো পরিবর্তন করতে পারবে না।
- এটি সাধারণত FOR UPDATE কুয়েরি দিয়ে ব্যবহৃত হয়।
Advisory Locks:
- PostgreSQL Advisory Locks প্রদান করে, যা ডেটাবেস লেভেলে সিস্টেমের কাস্টম লকিং ব্যবস্থা তৈরি করতে সহায়তা করে। এটি সাধারণত অ্যাপ্লিকেশন লেভেলে ব্যবহৃত হয় এবং অটোমেটিক নয়।
উদাহরণ:
SELECT pg_advisory_lock(12345); -- Lock using custom lock id -- Do some work SELECT pg_advisory_unlock(12345); -- Unlock after work is done
3. Types of Locks in PostgreSQL
PostgreSQL এ কিছু সাধারণ লক ধরন রয়েছে, যেমন:
- Access Share Lock:
SELECTকুয়েরি যখন এক্সিকিউট করা হয়। - Row Share Lock: এটি অন্যান্য ট্রানজেকশনের জন্য রো-তে পঠন ও লেখা নিষিদ্ধ করে।
- Exclusive Lock: শুধুমাত্র একটি ট্রানজেকশনের জন্য রো বা টেবিল সম্পূর্ণ নিয়ন্ত্রণ রাখে।
- Access Exclusive Lock: এটি টেবিল লক করে, অন্য কোনো ট্রানজেকশনকে অ্যাক্সেসের অনুমতি দেয় না।
4. Deadlock and Deadlock Detection
Deadlock একটি পরিস্থিতি যেখানে একাধিক ট্রানজেকশন একে অপরের জন্য অপেক্ষা করছে, এবং তাদের মধ্যে কোনো প্রগ্রেস হচ্ছে না। PostgreSQL এই ডেডলক সিচুয়েশনগুলি শনাক্ত করতে এবং সমাধান করতে সক্ষম।
PostgreSQL ডেডলক সিচুয়েশন সনাক্ত করার জন্য নিম্নলিখিত পদ্ধতি ব্যবহার করে:
- Timeout: যদি একটি ট্রানজেকশন ডেডলকে আটকে থাকে, PostgreSQL এটি একটি নির্দিষ্ট সময় পর নিষ্ক্রিয় করে দেয়।
- Automated Deadlock Detection: PostgreSQL ডেডলক সিচুয়েশন স্বয়ংক্রিয়ভাবে সনাক্ত করে এবং এক বা একাধিক ট্রানজেকশনকে বাতিল করে দেয়।
5. Isolation Levels and Their Impact on Locking
PostgreSQL বিভিন্ন Isolation Levels সাপোর্ট করে, যা ট্রানজেকশনগুলির মধ্যে ইন্টারঅ্যাকশন নির্ধারণ করে এবং ডেটাবেসে লকিং-এর আচরণ প্রভাবিত করে।
- Read Uncommitted: এই স্তরে একটি ট্রানজেকশন অপর ট্রানজেকশনের অকমিটেড পরিবর্তন দেখতে পারে। এটি PostgreSQL এ সমর্থিত না।
- Read Committed: এটি ডিফল্ট আইসোলেশন লেভেল, যেখানে ট্রানজেকশন শুধুমাত্র কমিটেড ডেটা দেখতে পায়।
- Repeatable Read: এই লেভেলে, ট্রানজেকশন একটি নির্দিষ্ট ডেটা সেটের সাথে কাজ করে এবং পরবর্তী সময়ে সেই ডেটাতে পরিবর্তন হলে তা দেখতে পায় না।
- Serializable: এটি সর্বোচ্চ আইসোলেশন লেভেল, যেখানে কোনো ট্রানজেকশন অন্য ট্রানজেকশন দ্বারা প্রভাবিত হতে পারে না। এটি অধিক লকিং সৃষ্টি করতে পারে, তবে ডেটার সঠিকতা নিশ্চিত হয়।
সারাংশ
- Concurrency PostgreSQL-এ একাধিক ট্রানজেকশনকে সমান্তরালভাবে চলতে সাহায্য করে, যেখানে MVCC প্রযুক্তি সঠিকভাবে ট্রানজেকশনগুলির প্রভাব সীমাবদ্ধ রাখে।
- Locking Mechanisms ডেটাবেসের মধ্যে একাধিক ট্রানজেকশনের মধ্যে অ্যাক্সেস কন্ট্রোল বজায় রাখে এবং সঠিক ডেটার অ্যাক্সেস নিশ্চিত করে।
- Deadlock শনাক্তকরণ এবং Isolation Levels এর মাধ্যমে ট্রানজেকশন পরিচালনা করা হয়, যাতে সঠিকতা এবং কার্যকারিতা বজায় থাকে।
Read more