Data Consistency in TypeORM
Data Consistency (ডেটা কনসিস্টেন্সি) হল ডেটাবেসে ডেটার সঠিকতা এবং নির্ভুলতা বজায় রাখা। TypeORM ব্যবহার করার সময়, ডেটা কনসিস্টেন্সি নিশ্চিত করার জন্য বিভিন্ন কৌশল প্রয়োগ করা হয়। যখন ডেটাবেসের মধ্যে একাধিক ট্রানজেকশন পরিচালিত হয়, তখন নিশ্চিত করতে হয় যে একাধিক প্রসেস একই ডেটাতে প্রভাব ফেলছে না এবং ডেটা সঠিকভাবে সংরক্ষিত হচ্ছে।
TypeORM ডেটাবেসের ACID (Atomicity, Consistency, Isolation, Durability) বৈশিষ্ট্যগুলো মেনে চলে এবং আপনাকে ডেটার কনসিস্টেন্সি নিশ্চিত করার জন্য উপযুক্ত কার্যকরী টুল সরবরাহ করে।
1. ACID Properties in TypeORM
TypeORM-এ ACID বৈশিষ্ট্যগুলি রক্ষিত থাকে, যা ডেটাবেসে ট্রানজেকশন পরিচালনা করার সময় ডেটার সঠিকতা এবং নির্ভুলতা নিশ্চিত করে।
- Atomicity: একটি ট্রানজেকশন যদি সফলভাবে সম্পন্ন না হয়, তবে সমস্ত পরিবর্তন বাতিল হয়ে যাবে। TypeORM এ, Transactional বৈশিষ্ট্য ব্যবহার করে আপনি এটিকে সহজে বাস্তবায়ন করতে পারেন।
- Consistency: ডেটা একক বা কয়েকটি ট্রানজেকশনের মাধ্যমে সঠিক এবং নির্ভুল অবস্থায় থাকবে। TypeORM-এ ট্রানজেকশন ব্যবহারের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে ডেটাবেসের মধ্যে সব পরিবর্তন সঠিকভাবে সম্পাদিত হচ্ছে।
- Isolation: একাধিক ট্রানজেকশন একে অপরের ডেটাতে প্রভাব ফেলতে পারে না। TypeORM আপনাকে isolation level কনফিগার করার সুযোগ দেয় যাতে একাধিক ট্রানজেকশন একে অপরকে প্রভাবিত না করে।
- Durability: ডেটা একবার রাইট হলে তা চিরকালই রক্ষা পাবে, যতই সিস্টেম বা সার্ভার বন্ধ হোক না কেন।
2. Transactions in TypeORM
TypeORM-এ transactions ব্যবহার করে আপনি ডেটাবেসে একাধিক অপারেশন একত্রে পরিচালনা করতে পারেন। এটি ডেটা কনসিস্টেন্সি নিশ্চিত করার একটি গুরুত্বপূর্ণ উপায়। TypeORM এ transaction শুরু করা এবং তার সাথে সম্পর্কিত কাজগুলি করতে নিচের কোডটি ব্যবহার করা হয়:
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = connection.getRepository(User);
// Begin a transaction
const queryRunner = connection.createQueryRunner();
await queryRunner.startTransaction();
try {
const user = new User();
user.name = "John Doe";
user.email = "john.doe@example.com";
await queryRunner.manager.save(user);
// Commit the transaction
await queryRunner.commitTransaction();
} catch (error) {
// If something goes wrong, rollback the transaction
await queryRunner.rollbackTransaction();
} finally {
// Release the query runner to avoid memory leaks
await queryRunner.release();
}
}).catch(error => console.log(error));
এখানে, queryRunner ব্যবহার করে একটি ট্রানজেকশন শুরু করা হয়েছে, যা সফল হলে commitTransaction() এবং যদি কোনো সমস্যা হয় তবে rollbackTransaction() কার্যকর হয়।
Distributed Transactions
Distributed Transactions হল এমন একটি প্রক্রিয়া যেখানে একাধিক ডাটাবেস বা সিস্টেমের মধ্যে একযোগে ট্রানজেকশন পরিচালিত হয়। যখন আপনি একটি অ্যাপ্লিকেশন তৈরি করেন, যার মধ্যে একাধিক সার্ভার বা সিস্টেমের মধ্যে ডেটা ভাগ করা হয়, তখন distributed transactions ব্যবহার করা প্রয়োজন।
1. Why Distributed Transactions?
Distributed transactions প্রয়োজনীয় হয় যখন একাধিক মাইক্রোসার্ভিস বা সিস্টেমের মধ্যে ডেটা প্রসেসিং এবং পরিবর্তন করতে হয়, কিন্তু সেই পরিবর্তনগুলো একে অপরের উপর নির্ভরশীল থাকে। যেমন, যদি আপনি দুটি আলাদা সার্ভার বা ডেটাবেসে ডেটা ইনসার্ট বা আপডেট করতে চান, তবে আপনি নিশ্চিত করতে চান যে দুটি পরিবর্তনই সফলভাবে সম্পন্ন হয় অথবা যদি একটি ব্যর্থ হয় তবে অন্যটি বাতিল হয়ে যাবে।
2. Managing Distributed Transactions with TypeORM
TypeORM সরাসরি distributed transactions সমর্থন করে না, তবে আপনি Saga Pattern বা Two-Phase Commit পদ্ধতি ব্যবহার করে এই সমস্যা সমাধান করতে পারেন।
- Saga Pattern: এটি একটি লজিক্যাল প্যাটার্ন যা একাধিক সিস্টেমের মধ্যে অ্যাটমিক অপারেশন সম্পাদন করে। যদি একটি অপারেশন ব্যর্থ হয়, তবে অন্য অপারেশনগুলো ব্যাকআপ বা রোলব্যাক হয়।
- Two-Phase Commit (2PC): এটি একটি কৌশল যেখানে দুটি বা ততোধিক ডাটাবেসে ট্রানজেকশন পরিচালনা করার সময় প্রথমে প্রস্তুতি নেওয়া হয় এবং পরে নিশ্চিতকরণ (commit) বা বাতিল (rollback) করা হয়।
3. Handling Distributed Transactions Using TypeORM
TypeORM এর মাধ্যমে একাধিক ডাটাবেস বা সার্ভিসের মধ্যে ডিস্ট্রিবিউটেড ট্রানজেকশন পরিচালনা করার জন্য, আপনি ম্যানুয়ালি ডিস্ট্রিবিউটেড লজিক প্রয়োগ করতে পারেন। যদিও TypeORM সরাসরি two-phase commit বা distributed transactions সমর্থন করে না, আপনি queryRunner ব্যবহার করে ট্রানজেকশন পরিচালনা করতে পারেন এবং সার্ভিস লেয়ারে সেগুলিকে একত্রিত করতে পারেন।
Example: Two-phase Commit
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = connection.getRepository(User);
// Step 1: Start transaction for DB1
const queryRunner1 = connection.createQueryRunner();
await queryRunner1.startTransaction();
try {
const user1 = new User();
user1.name = "John Doe";
user1.email = "john.doe@example.com";
await queryRunner1.manager.save(user1);
// Step 2: Start another transaction for DB2 (another system)
const queryRunner2 = connection.createQueryRunner();
await queryRunner2.startTransaction();
const user2 = new User();
user2.name = "Jane Doe";
user2.email = "jane.doe@example.com";
await queryRunner2.manager.save(user2);
// Step 3: Commit both transactions
await queryRunner1.commitTransaction();
await queryRunner2.commitTransaction();
} catch (error) {
// Step 4: Rollback both transactions if something goes wrong
await queryRunner1.rollbackTransaction();
await queryRunner2.rollbackTransaction();
} finally {
// Step 5: Release query runners
await queryRunner1.release();
await queryRunner2.release();
}
}).catch(error => console.log(error));
এখানে দুটি ডাটাবেসে ট্রানজেকশন সম্পন্ন করা হচ্ছে, এবং যদি কোনো একটি ব্যর্থ হয়, তবে অন্যটি রোলব্যাক করা হয়।
সারাংশ
Data Consistency নিশ্চিত করার জন্য TypeORM-এ transactions ব্যবহারের মাধ্যমে আপনি ACID বৈশিষ্ট্যগুলি কার্যকরভাবে প্রয়োগ করতে পারেন। Distributed Transactions পরিচালনা করা একটু জটিল হতে পারে, তবে Saga Pattern বা Two-Phase Commit প্যাটার্ন ব্যবহার করে আপনি একাধিক সিস্টেমের মধ্যে ডেটার সঠিকতা এবং নির্ভুলতা নিশ্চিত করতে পারেন। TypeORM-এ transactions এবং distributed transactions এর ব্যবহারের মাধ্যমে আপনি ডেটা কনসিস্টেন্সি বজায় রাখতে পারবেন এবং আপনার অ্যাপ্লিকেশনকে আরো স্কেলেবল ও নির্ভরযোগ্য করে তুলতে পারবেন।
Read more