При управлении базами данных транзакции играют решающую роль в обеспечении целостности и согласованности данных. TypeORM, популярная библиотека объектно-реляционного сопоставления (ORM) для TypeScript и JavaScript, предоставляет мощные функции для управления транзакциями и обработки каскадных отношений. В этой статье мы рассмотрим различные методы и примеры кода для сохранения каскадов в TypeORM и использования RollbackTransaction для обработки потенциальных ошибок.
- Управление транзакциями вручную.
Одним из подходов к обработке транзакций в 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();
}
}
- Использование декоратора @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;
}
}
}
- Использование каскадов во взаимоотношениях сущностей.
TypeORM предоставляет параметры каскадирования, которые автоматически сохраняют связанные сущности. Настраивая каскады в отношениях сущностей, вы можете гарантировать, что связанные сущности будут сохранены или обновлены при сохранении родительской сущности.
@Entity()
class User {
// ...
@OneToMany(() => Post, post => post.user, { cascade: true })
posts: Post[];
}
При включении каскадов вы можете сохранить родительский объект, а TypeORM автоматически сохранит связанные дочерние объекты.
Обработка транзакций и каскадное сохранение — важные аспекты управления базами данных. В этой статье мы рассмотрели различные методы сохранения каскадов в TypeORM, используя RollbackTransaction для обработки потенциальных ошибок. Управляя транзакциями вручную, используя декоратор @Transactionи настраивая каскады в отношениях сущностей, вы можете обеспечить целостность данных и эффективно обрабатывать ошибки в ваших приложениях TypeORM.