NestJS एंटरप्राइज़ बैकएंड API · पाठ

ट्रांज़ैक्शन और माइग्रेशन

परमाणु ऑपरेशन के लिए डेटाबेस ट्रांज़ैक्शन लागू कीजिए और TypeORM माइग्रेशन से स्कीमा में होने वाले बदलाव कुशलता से प्रबंधित कीजिए।

पाठ 2, कुल 3 में से12 चरण

ट्रांज़ैक्शन और माइग्रेशन, CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API का एक निःशुल्क पाठ है। यह 3 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह NestJS एंटरप्राइज़ बैकएंड API सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

परमाणु संचालन: लेन-देन

कल्पना कीजिए कि आप दो बैंक खातों के बीच धनराशि स्थानांतरित कर रहे हैं। यदि एक खाते से धन घटाने की प्रक्रिया सफल हो जाए, लेकिन दूसरे खाते में धन जोड़ने की प्रक्रिया विफल हो जाए, तो आपका डेटा असंगत हो जाएगा!

डेटाबेस लेन-देन कई डेटाबेस संचालनों को एकल, परमाणु इकाई में समूहित करके इस समस्या का समाधान करते हैं। या तो सभी संचालन सफल होते हैं (कमिट), या उनमें से कोई भी सफल नहीं होता (रोलबैक)।

ACID गुणों को समझना

लेन-देन ACID गुणों का पालन करके डेटा की विश्वसनीयता सुनिश्चित करते हैं:

  • परमाणुता: सब कुछ या कुछ भी नहीं।
  • संगतता: डेटाबेस की स्थिति मान्य बनी रहती है।
  • पृथक्करण: एक साथ चलने वाले लेन-देन एक-दूसरे में हस्तक्षेप नहीं करते।
  • स्थायित्व: कमिट किए गए बदलाव स्थायी होते हैं।

जटिल अनुप्रयोगों में डेटा की अखंडता बनाए रखने के लिए ये गुण अत्यंत महत्वपूर्ण हैं।

TypeORM में मैन्युअल लेन-देन

TypeORM आपको DataSource या EntityManager का उपयोग करके लेन-देन को मैन्युअल रूप से प्रबंधित करने की सुविधा देता है। इससे आपको कमिट या रोलबैक करने के समय पर सूक्ष्म नियंत्रण मिलता है।

आमतौर पर आप dataSource.transaction(async manager => { ... }) का उपयोग करते हैं, जहाँ manager लेन-देन प्रबंधित करने वाला इकाई प्रबंधक होता है।

मैन्युअल लेन-देन का उदाहरण

यह लेन-देन के भीतर धनराशि स्थानांतरित करने का एक सरल उदाहरण है। यदि कोई भी चरण विफल होता है, तो पूरा संचालन वापस कर दिया जाता है।

import { DataSource, Entity, PrimaryGeneratedColumn, Column, Repository } from 'typeorm';

@Entity()
export class Account {
  @PrimaryGeneratedColumn() id: number;
  @Column({ type: 'decimal', precision: 10, scale: 2 }) balance: number;
}

async function runTransaction() {
  const AppDataSource = new DataSource({
    type: 'sqlite',
    database: ':memory:',
    entities: [Account],
    synchronize: true,
  });

  await AppDataSource.initialize();
  const accountRepo = AppDataSource.getRepository(Account);

  await AppDataSource.transaction(async manager => {
    const sender = await manager.save(accountRepo.create({ balance: 100 }));
    const receiver = await manager.save(accountRepo.create({ balance: 50 }));

    console.log(`Initial: Sender ${sender.balance}, Receiver ${receiver.balance}`);

    sender.balance -= 20;
    receiver.balance += 20;

    await manager.save(sender);
    // Simulate an error here to trigger rollback:
    // throw new Error('Failed to update receiver!');
    await manager.save(receiver);

    console.log(`Final: Sender ${sender.balance}, Receiver ${receiver.balance}`);
  });

  await AppDataSource.destroy();
}

// To run this in a Node.js context:
// runTransaction().catch(console.error);
// For CoddyKit, we just show the code.

लेन-देन के लिए डेकोरेटर

NestJS और TypeORM अक्सर साथ मिलकर काम करते हैं। सुविधा के लिए TypeORM @Transaction() और @TransactionManager() डेकोरेटर उपलब्ध कराता है।

आप @Transaction() को किसी सेवा विधि पर लागू कर सकते हैं और TypeORM उस विधि के निष्पादन को स्वचालित रूप से एक लेन-देन में लपेट देगा।

डेकोरेटर द्वारा लेन-देन का उदाहरण

@Transaction() डेकोरेटर का उपयोग करने से आपकी सेवा का कोड अधिक साफ़-सुथरा हो जाता है, क्योंकि आपको लेन-देन के कमिट या रोलबैक को मैन्युअल रूप से संभालने की आवश्यकता नहीं होती।

import { Injectable } from '@nestjs/common';
import { Repository, EntityManager } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { Transaction } from 'typeorm'; // Import Transaction decorator

// Assume Account Entity is defined elsewhere
class Account { 
  id: number; 
  balance: number; 
}

@Injectable()
export class BankService {
  constructor(
    @InjectRepository(Account) private accountRepository: Repository<Account>,
  ) {}

  @Transaction()
  async transferFunds(
    senderId: number,
    receiverId: number,
    amount: number,
    @TransactionManager() manager?: EntityManager, // Manager is injected
  ): Promise<boolean> {
    const accountManager = manager || this.accountRepository.manager; // Use injected manager

    const sender = await accountManager.findOneBy(Account, { id: senderId });
    const receiver = await accountManager.findOneBy(Account, { id: receiverId });

    if (!sender || !receiver || sender.balance < amount) {
      throw new Error('Transfer failed: Invalid accounts or insufficient funds');
    }

    sender.balance -= amount;
    receiver.balance += amount;

    await accountManager.save(sender);
    await accountManager.save(receiver);

    console.log(`Transferred ${amount}. Sender: ${sender.balance}, Receiver: ${receiver.balance}`);
    return true;
  }
}

// Note: This code is illustrative within a NestJS service context. 
// It's not runnable as a standalone script without a full NestJS setup.

स्कीमा बदलाव प्रबंधित करना: माइग्रेशन

जैसे-जैसे आपका अनुप्रयोग विकसित होता है, आपके डेटाबेस का स्कीमा भी बदलता रहेगा, जैसे नए कॉलम या तालिकाएँ जोड़ना। डेटाबेस में सीधे बदलाव करना जोखिमपूर्ण और उसका पता रखना कठिन हो सकता है।

डेटाबेस माइग्रेशन आपके डेटाबेस स्कीमा में बदलाव लागू करने का एक व्यवस्थित और संस्करण-नियंत्रित तरीका प्रदान करते हैं, जिससे विभिन्न परिवेशों में संगतता बनी रहती है।

TypeORM माइग्रेशन बनाना

TypeORM में माइग्रेशन फ़ाइलें बनाने के लिए एक शक्तिशाली CLI है। यह आपकी इकाइयों की तुलना वर्तमान डेटाबेस स्कीमा से करता है और अंतर को दूर करने वाली स्क्रिप्ट बनाता है।

पहले सुनिश्चित कीजिए कि आपका ormconfig.json या DataSource सही ढंग से सेट अप है। फिर यह कमांड चलाइए:

  • npx typeorm migration:generate src/migration/MyNewMigration

इससे निर्दिष्ट फ़ोल्डर में समय-मुद्रांकित .ts फ़ाइल बनती है।

माइग्रेशन फ़ाइल की संरचना

प्रत्येक माइग्रेशन फ़ाइल में दो प्रमुख विधियाँ होती हैं:

  • up(queryRunner: QueryRunner): Promise: डेटाबेस पर लागू किए जाने वाले बदलावों को परिभाषित करती है, जैसे तालिका बनाना या कॉलम जोड़ना।
  • down(queryRunner: QueryRunner): Promise: up द्वारा किए गए बदलावों को वापस लेने का तरीका परिभाषित करती है, जैसे तालिका हटाना या कॉलम निकालना।

इससे आप स्कीमा के संस्करणों में आसानी से आगे और पीछे जा सकते हैं।

import { MigrationInterface, QueryRunner, Table } from 'typeorm';

export class MyNewMigration1678886400000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(
      new Table({
        name: 'products',
        columns: [
          { name: 'id', type: 'int', isPrimary: true, isGenerated: true, generationStrategy: 'increment' },
          { name: 'name', type: 'varchar' },
          { name: 'price', type: 'decimal', precision: 10, scale: 2, default: 0 },
        ],
      }),
      true,
    );
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable('products');
  }
}

माइग्रेशन लागू करना और वापस लेना

अपनी माइग्रेशन फ़ाइलें लिखने या बनाने के बाद, आपको उन्हें अपने डेटाबेस पर लागू करना होगा:

  • सभी लंबित माइग्रेशन लागू करें: npx typeorm migration:run
  • अंतिम लागू किए गए माइग्रेशन को वापस लें: npx typeorm migration:revert

स्कीमा को समकालिक बनाए रखने के लिए अपने विकास और उत्पादन परिवेशों में हमेशा माइग्रेशन चलाइए।

अपना ज्ञान जाँचें

TypeORM में डेटाबेस लेन-देन और माइग्रेशन के बारे में निम्नलिखित में से कौन-सा कथन FALSE है?

पुनरावलोकन: लेन-देन और माइग्रेशन

आपने सुदृढ़ डेटाबेस प्रबंधन की दो महत्वपूर्ण अवधारणाओं के बारे में सीखा है:

  • लेन-देन: TypeORM की मैन्युअल विधियों या @Transaction() डेकोरेटर का उपयोग करके ACID सिद्धांतों के अनुरूप परमाणु संचालन द्वारा डेटा की अखंडता सुनिश्चित करते हैं।
  • माइग्रेशन: TypeORM CLI का उपयोग करके up() और down() विधियों के माध्यम से बदलाव बनाने और लागू करने का एक व्यवस्थित तरीका प्रदान करते हैं।

इनमें दक्षता हासिल करने से आपको अधिक विश्वसनीय और आसानी से अनुरक्षित बैकएंड API बनाने में सहायता मिलेगी।

शुरुआत निःशुल्क

एआई शिक्षक के साथ TypeScript सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
20
पाठ
76

अक्सर पूछे जाने वाले प्रश्न

क्या “ट्रांज़ैक्शन और माइग्रेशन” पाठ निःशुल्क है?

हाँ—“ट्रांज़ैक्शन और माइग्रेशन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। NestJS एंटरप्राइज़ बैकएंड API पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

“ट्रांज़ैक्शन और माइग्रेशन” में मैं क्या सीखूँगा?

परमाणु ऑपरेशन के लिए डेटाबेस ट्रांज़ैक्शन लागू कीजिए और TypeORM माइग्रेशन से स्कीमा में होने वाले बदलाव कुशलता से प्रबंधित कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ NestJS एंटरप्राइज़ बैकएंड API का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या NestJS एंटरप्राइज़ बैकएंड API शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर NestJS एंटरप्राइज़ बैकएंड API शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 2वाँ पाठ है।

“ट्रांज़ैक्शन और माइग्रेशन” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस NestJS एंटरप्राइज़ बैकएंड API पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर NestJS एंटरप्राइज़ बैकएंड API पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. कस्टम TypeORM रिपॉज़िटरी
  2. ट्रांज़ैक्शन और माइग्रेशन
  3. डेटाबेस सीडिंग और परीक्षण
← NestJS एंटरप्राइज़ बैकएंड API पर वापस जाएँ