Комплексное руководство по обработке транзакций и откатов в TypeORM с каскадным сохранением

При управлении базами данных транзакции играют решающую роль в обеспечении целостности и согласованности данных. TypeORM, популярная библиотека объектно-реляционного сопоставления (ORM) для TypeScript и JavaScript, предоставляет мощные функции для управления транзакциями и обработки каскадных отношений. В этой статье мы рассмотрим различные методы и примеры кода для сохранения каскадов в TypeORM и использования RollbackTransaction для обработки потенциальных ошибок.

  1. Управление транзакциями вручную.
    Одним из подходов к обработке транзакций в TypeORM является ручное управление областью транзакции с помощью метода getRepository. Давайте рассмотрим пример, где у нас есть объект Userс отношением один-ко-многим с объектами Post.
import { getManager } from 'typeorm';
// ...
async function saveUserWithPosts(user: User, posts: Post[]): Promise<void> {
  const entityManager = getManager();
  const queryRunner = entityManager.queryRunner;
  await queryRunner.startTransaction();
  try {
    await entityManager.save(user);
    for (const post of posts) {
      post.user = user;
      await entityManager.save(post);
    }
    await queryRunner.commitTransaction();
  } catch (error) {
    await queryRunner.rollbackTransaction();
    throw error;
  } finally {
    await queryRunner.release();
  }
}
  1. Использование декоратора @Transaction:
    TypeORM предоставляет удобный декоратор @Transactionдля автоматической обработки транзакций. Этот декоратор позволяет вам аннотировать ваши методы и позволить TypeORM управлять областью транзакции за вас.
import { Transaction } from 'typeorm';
// ...
class UserService {
  @Transaction()
  async saveUserWithPosts(user: User, posts: Post[]): Promise<void> {
    try {
      await this.userRepository.save(user);
      for (const post of posts) {
        post.user = user;
        await this.postRepository.save(post);
      }
    } catch (error) {
      throw error;
    }
  }
}
  1. Использование каскадов во взаимоотношениях сущностей.
    TypeORM предоставляет параметры каскадирования, которые автоматически сохраняют связанные сущности. Настраивая каскады в отношениях сущностей, вы можете гарантировать, что связанные сущности будут сохранены или обновлены при сохранении родительской сущности.
@Entity()
class User {
  // ...
  @OneToMany(() => Post, post => post.user, { cascade: true })
  posts: Post[];
}

При включении каскадов вы можете сохранить родительский объект, а TypeORM автоматически сохранит связанные дочерние объекты.

Обработка транзакций и каскадное сохранение — важные аспекты управления базами данных. В этой статье мы рассмотрели различные методы сохранения каскадов в TypeORM, используя RollbackTransaction для обработки потенциальных ошибок. Управляя транзакциями вручную, используя декоратор @Transactionи настраивая каскады в отношениях сущностей, вы можете обеспечить целостность данных и эффективно обрабатывать ошибки в ваших приложениях TypeORM.