Transactions শুরু করা এবং Commit/Rollback করা

Transactions এবং Concurrency Control - টাইপওআরএম (TypeORM) - Web Development

255

TypeORM এ Transactions

Transactions হল ডেটাবেসে একাধিক অপারেশন গ্রুপ করার একটি পদ্ধতি, যেখানে সব অপারেশন একত্রে সফলভাবে সম্পন্ন হলে এগুলো কমিট (commit) করা হয়, আর যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে সব অপারেশন রোলব্যাক (rollback) হয়ে যায়। এটি নিশ্চিত করে যে ডেটাবেসে কোনো আংশিক বা অসম্পূর্ণ পরিবর্তন না ঘটে এবং ডেটাবেসের অখণ্ডতা বজায় থাকে।

TypeORM-এ ট্রান্সেকশন ব্যবহারের জন্য QueryRunner ব্যবহার করা হয়, যা একটি সেশন তৈরি করে এবং একাধিক কুয়েরি একসাথে পরিচালনা করতে দেয়। এই সেশনটি ট্রান্সেকশন শুরু, কমিট বা রোলব্যাক করতে সহায়তা করে।


১. Transaction শুরু করা

TypeORM-এ ট্রান্সেকশন শুরু করতে QueryRunner ব্যবহার করতে হয়। এর মাধ্যমে আমরা ডেটাবেসের উপর একাধিক অপারেশন একত্রে পরিচালনা করতে পারি এবং পরে একটি নির্দিষ্ট সময় সব অপারেশন একযোগে কমিট বা রোলব্যাক করতে পারি।

Transaction শুরু করার উদাহরণ:

import { createConnection, getManager } from "typeorm";
import { User } from "./entity/User";
import { Post } from "./entity/Post";

createConnection().then(async connection => {
  const queryRunner = connection.createQueryRunner();

  // Start a transaction
  await queryRunner.startTransaction();
  
  try {
    // Create new user
    const user = new User();
    user.name = "John Doe";
    user.email = "john@example.com";
    await queryRunner.manager.save(user);

    // Create new post related to the user
    const post = new Post();
    post.title = "First Post";
    post.user = user;
    await queryRunner.manager.save(post);

    // Commit the transaction
    await queryRunner.commitTransaction();
    console.log("Transaction committed!");
  } catch (error) {
    // If any error occurs, rollback the transaction
    await queryRunner.rollbackTransaction();
    console.log("Transaction rolled back due to error!");
  } finally {
    // Release the query runner
    await queryRunner.release();
  }
}).catch(error => console.log(error));

এখানে, আমরা QueryRunner ব্যবহার করে একটি ট্রান্সেকশন শুরু করেছি, এর মধ্যে দুটি অপারেশন করেছি (একটি User তৈরি এবং একটি Post তৈরি), এবং শেষের দিকে যদি সব কিছু সঠিকভাবে চলে তাহলে commitTransaction() ব্যবহার করে কমিট করেছি। কোনো ত্রুটি ঘটলে rollbackTransaction() ব্যবহার করে রোলব্যাক করেছি।


২. Commit এবং Rollback

Commit:

একবার সমস্ত অপারেশন সফলভাবে সম্পন্ন হলে, commitTransaction() ব্যবহার করে ডেটাবেসে সমস্ত পরিবর্তন স্থায়ী করা হয়।

await queryRunner.commitTransaction();

Rollback:

যদি কোনো অপারেশন ব্যর্থ হয় বা ত্রুটি ঘটে, তবে rollbackTransaction() ব্যবহার করে সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনা হয়।

await queryRunner.rollbackTransaction();

৩. Multiple Operations with Transaction

TypeORM-এ একাধিক অপারেশন একসাথে একটি ট্রান্সেকশনে রাখা যেতে পারে। এতে যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে সমস্ত অপারেশন রোলব্যাক করা হবে। নিচে একাধিক অপারেশন পরিচালনার উদাহরণ দেওয়া হলো:

Multiple Operations Example:

import { createConnection } from "typeorm";
import { User } from "./entity/User";
import { Post } from "./entity/Post";

createConnection().then(async connection => {
  const queryRunner = connection.createQueryRunner();

  // Start a transaction
  await queryRunner.startTransaction();
  
  try {
    // Create a new user
    const user = new User();
    user.name = "Jane Doe";
    user.email = "jane@example.com";
    await queryRunner.manager.save(user);

    // Create two posts related to the user
    const post1 = new Post();
    post1.title = "First Post by Jane";
    post1.user = user;
    await queryRunner.manager.save(post1);

    const post2 = new Post();
    post2.title = "Second Post by Jane";
    post2.user = user;
    await queryRunner.manager.save(post2);

    // Commit the transaction
    await queryRunner.commitTransaction();
    console.log("All changes have been committed!");
  } catch (error) {
    // Rollback the transaction if any error occurs
    await queryRunner.rollbackTransaction();
    console.log("An error occurred, transaction rolled back!");
  } finally {
    // Release the query runner
    await queryRunner.release();
  }
}).catch(error => console.log(error));

এখানে আমরা দুটি Post তৈরি করেছি, তবে যেহেতু সব অপারেশন একসাথে একটি ট্রান্সেকশনে রাখা হয়েছে, কোনো ত্রুটি ঘটলে সমস্ত পরিবর্তন রোলব্যাক হয়ে যাবে।


৪. Nested Transactions

TypeORM সরাসরি nested transactions সমর্থন করে না, তবে আপনি যদি nested ট্রান্সেকশনের মতো কিছু বাস্তবায়ন করতে চান, তবে আপনি sub-transactions তৈরি করতে পারেন যেখানে একটি মূল ট্রান্সেকশনে সাব-ট্রান্সেকশন অপারেশন থাকে। তবে, এটি সাধারণত queryRunner এর মাধ্যমে করা হয় এবং সাব-ট্রান্সেকশন পরিচালনা করার জন্য বিভিন্ন স্তরে commitTransaction() এবং rollbackTransaction() কল করা হতে পারে।


৫. Transaction Performance Considerations

যখন আপনি একটি বড় ট্রান্সেকশন পরিচালনা করছেন, তখন কিছু বিষয় মাথায় রাখা গুরুত্বপূর্ণ:

  • ডেটাবেসের অখণ্ডতা (Integrity): সব ট্রান্সেকশনের মধ্যে সম্পর্ক থাকা উচিত, যাতে কোন একটি অপারেশন ব্যর্থ হলে সব পরিবর্তন পূর্বাবস্থায় ফিরে যায়।
  • পারফরম্যান্স: একাধিক অপারেশন চালানোর জন্য ট্রান্সেকশন ব্যবহারের সময় পারফরম্যান্স অ্যাকাউন্টে রাখা উচিত, বিশেষত বড় ডেটা সেটে।
  • অপারেশন সিকোয়েন্স (Operation Sequence): ট্রান্সেকশনে কোন অপারেশন আগে এবং কোন অপারেশন পরে আসবে তা সঠিকভাবে পরিকল্পনা করা উচিত।

সারাংশ

TypeORM-এ Transactions ব্যবহারের মাধ্যমে আপনি ডেটাবেস অপারেশনগুলো একত্রে এবং একযোগে পরিচালনা করতে পারেন, যা ডেটাবেসের অখণ্ডতা বজায় রাখতে সহায়তা করে। Commit এবং Rollback ব্যবহার করে আপনি সফল অপারেশনগুলো সংরক্ষণ এবং ব্যর্থ অপারেশনগুলো পুনরুদ্ধার করতে পারেন। QueryRunner এর মাধ্যমে ট্রান্সেকশন পরিচালনা করা হয় এবং Transaction ব্যবহারের সময় সঠিক পরিকল্পনা ও কার্যকারিতা নিশ্চিত করতে হবে। TypeORM-এ ট্রান্সেকশন ব্যবহারের মাধ্যমে ডেটাবেসে নিরাপদ এবং স্থিতিশীল পরিবর্তন করা সম্ভব হয়।

Content added By
Promotion

Are you sure to start over?

Loading...