Concurrency Issues এবং তাদের সমাধান

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

272

Concurrency Issues: একটি পরিচিতি

Concurrency Issues হল এমন পরিস্থিতি যেখানে একাধিক প্রক্রিয়া বা থ্রেড একে অপরের সাথে একযোগে কাজ করে এবং কখনও কখনও তাদের মধ্যে সংঘর্ষ (conflict) সৃষ্টি হয়, যেমন একই ডেটা একাধিক বার পরিবর্তন করা। ডেটাবেস অ্যাপ্লিকেশনগুলির ক্ষেত্রে, concurrency issues সাধারণত ঘটে যখন একাধিক ব্যবহারকারী বা প্রসেস একই সময়ে ডেটাবেসের একটি রেকর্ড বা টেবিলের উপর কাজ করার চেষ্টা করে।

TypeORM ব্যবহারের সময়, এই ধরনের সমস্যা সমাধান করা অত্যন্ত গুরুত্বপূর্ণ, কারণ concurrency issues ডেটার অপ্রত্যাশিত পরিবর্তন, তথ্য হারানো বা টেবিলের ডাটা অখণ্ডতা ক্ষতিগ্রস্ত করতে পারে। সুতরাং, টাইপওআরএমে concurrency control এবং data integrity রক্ষা করা প্রয়োজন।

এই গাইডে, আমরা TypeORM-এ concurrency issues মোকাবেলা করার জন্য বিভিন্ন পদ্ধতি এবং Best Practices নিয়ে আলোচনা করব।


Concurrency Issues Types

প্রথমে, concurrency issues এর কিছু সাধারণ ধরন দেখা যাক:

  1. Lost Update: দুটি প্রক্রিয়া একই ডেটা একসাথে পরিবর্তন করে, ফলে একটি পরিবর্তন হারিয়ে যায় এবং অন্য একটি পরিবর্তন প্রাধান্য পায়।
  2. Temporary Inconsistency: একাধিক প্রক্রিয়া ডেটা পড়ছে এবং পরিবর্তন করছে, যার ফলে ডেটাবেস সাময়িকভাবে অস্থির অবস্থায় থাকে।
  3. Deadlock: একাধিক প্রক্রিয়া পরস্পরের জন্য অপেক্ষা করতে থাকে, যেমন দুইটি ট্রানজেকশন একে অপরের লক করা রিসোর্সের জন্য অপেক্ষা করছে।

Concurrency Issues সমাধান করার কৌশল

TypeORM-এ Concurrency Issues সমাধান করতে সাধারণত তিনটি প্রধান কৌশল ব্যবহার করা হয়: Optimistic Locking, Pessimistic Locking, এবং Database Transactions


১. Optimistic Locking

Optimistic Locking হল একটি কৌশল যেখানে আমরা ধরে নিই যে, একাধিক থ্রেড একই সময়ে একই রেকর্ডে কাজ করার চেষ্টা করবে না। তবে, যদি এমন কিছু ঘটে, তবে এটি একটি ভুল বা conflict ঘটাবে, এবং সেই অবস্থায় আপডেট ব্যর্থ হবে।

TypeORM-এ Optimistic Locking এর জন্য, সাধারণত versioning ব্যবহৃত হয়। এক্ষেত্রে, একটি version ফিল্ড প্রতিটি রেকর্ডে রাখা হয় এবং যে কোনো থ্রেড বা ব্যবহারকারী রেকর্ডটি আপডেট করার আগে তার version নম্বর যাচাই করে।

উদাহরণ: Optimistic Locking

  1. Entity এ version ফিল্ড যোগ করা:
import { Entity, PrimaryGeneratedColumn, Column, VersionColumn } from "typeorm";

@Entity()
export class Post {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  content: string;

  @VersionColumn()  // version column for optimistic locking
  version: number;
}

এখানে, @VersionColumn() ডেকোরেটরটি রেকর্ডের প্রতিটি আপডেটের সময় version নম্বর আপডেট করবে।

  1. ডেটা আপডেট করার সময় version চেক করা:
import { getRepository } from "typeorm";
import { Post } from "./entity/Post";

async function updatePost(id: number, newTitle: string, newContent: string) {
  const postRepository = getRepository(Post);

  const post = await postRepository.findOne(id);
  if (!post) {
    throw new Error("Post not found");
  }

  post.title = newTitle;
  post.content = newContent;

  // Optimistic Locking check
  const result = await postRepository.save(post).catch(err => {
    if (err.code === "23505") { // Constraint violation due to version conflict
      throw new Error("The post has been modified by another user.");
    }
    throw err;
  });

  console.log("Post updated:", result);
}

এখানে, save() মেথড দিয়ে ডেটা আপডেট করা হয় এবং যদি version mismatch ঘটে, তখন error ধরা হয় এবং আপডেট ব্যর্থ হয়ে যায়।


২. Pessimistic Locking

Pessimistic Locking হল এমন একটি কৌশল যেখানে ডেটা পরিবর্তন করার সময় রেকর্ড বা রিসোর্সের উপর লক বসানো হয়। এটি ডেটার উপর একাধিক ব্যবহারকারীর অ্যাক্সেস নিয়ন্ত্রণ করে। সাধারণত getRepository().lock() ব্যবহার করা হয় যাতে একাধিক থ্রেড একই সময়ে একাধিক পরিবর্তন না করতে পারে।

উদাহরণ: Pessimistic Locking

import { getRepository } from "typeorm";
import { Post } from "./entity/Post";

async function updatePostWithLock(id: number, newTitle: string, newContent: string) {
  const postRepository = getRepository(Post);

  const post = await postRepository.findOne(id, { lock: { mode: "pessimistic_write" } });
  if (!post) {
    throw new Error("Post not found");
  }

  post.title = newTitle;
  post.content = newContent;

  await postRepository.save(post);

  console.log("Post updated with pessimistic locking:", post);
}

এখানে, pessimistic_write লক ব্যবহার করা হয়েছে, যার ফলে একটি থ্রেড যখন রেকর্ডটি আপডেট করছে, তখন অন্য থ্রেডরা সেই রেকর্ডে কোনো পরিবর্তন করতে পারবে না যতক্ষণ না প্রথম থ্রেড কাজটি শেষ করে।


৩. Transactions

Transactions হল একটি অত্যন্ত গুরুত্বপূর্ণ কৌশল যা ডেটাবেসের সঠিকতা এবং অখণ্ডতা নিশ্চিত করতে সাহায্য করে। একটি ট্রানজেকশন হল একাধিক SQL অপারেশন যা একটি অ্যাটমিক ইউনিট হিসেবে কাজ করে। একাধিক অপারেশন যখন একসাথে কাজ করে, তখন ACID (Atomicity, Consistency, Isolation, Durability) বৈশিষ্ট্যগুলির সাথে এটি সম্পন্ন হয়।

TypeORM-এ transactions ব্যবহারের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে, যদি কোনো অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশনটি রোলব্যাক করা হবে এবং ডেটাবেসের অখণ্ডতা বজায় থাকবে।

উদাহরণ: Transactions ব্যবহার করা

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

async function updatePostInTransaction(id: number, newTitle: string, newContent: string) {
  const manager = getManager();

  await manager.transaction(async (transactionalEntityManager) => {
    const post = await transactionalEntityManager.findOne(Post, id);
    if (!post) {
      throw new Error("Post not found");
    }

    post.title = newTitle;
    post.content = newContent;

    await transactionalEntityManager.save(Post, post);
  });

  console.log("Post updated successfully inside transaction");
}

এখানে, manager.transaction() ব্যবহার করে একটি ট্রানজেকশন শুরু করা হয়েছে এবং তার মধ্যে সমস্ত অপারেশন নিশ্চিত করা হয়েছে। যদি কোনো ত্রুটি ঘটে, তাহলে সম্পূর্ণ ট্রানজেকশন রোলব্যাক হবে।


৪. Deadlock Issues এবং সমাধান

Deadlock সমস্যা তখন ঘটে যখন দুই বা ততোধিক থ্রেড একে অপরের জন্য অপেক্ষা করে থাকে, যার ফলে কোনো থ্রেডই কাজ করতে পারে না। এটি সিস্টেমের কর্মক্ষমতাকে মারাত্মকভাবে কমিয়ে দেয়।

Deadlock রোধ করতে আপনি:

  • Locking Order নির্ধারণ করতে পারেন।
  • Timeout ব্যবহার করতে পারেন যাতে দীর্ঘ সময় ধরে লক আটকানো না থাকে।

TypeORM-এ Deadlock রোধে কিছু ব্যবস্থা নিতে পারেন, যেমন লক সময়সীমা নির্ধারণ করা।


সারাংশ

Concurrency Issues টাইপওআরএম ব্যবহারকারীদের জন্য একটি গুরুত্বপূর্ণ চ্যালেঞ্জ। এগুলো মোকাবেলার জন্য, TypeORM-এ Optimistic Locking, Pessimistic Locking, এবং Transactions ব্যবহৃত হয়। এই কৌশলগুলি ডেটাবেসের ডেটার অখণ্ডতা এবং সঠিকতা রক্ষা করে। Deadlock সমস্যার জন্য যথাযথ লকিং এবং টাইমআউট ব্যবস্থার মাধ্যমে আপনি ডেটাবেসের কর্মক্ষমতা উন্নত করতে পারেন। TypeORM-এ concurrency control কৌশলগুলি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের স্কেলেবিলিটি এবং পারফরম্যান্স উন্নত করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...