⌨ Transaction 사용
- import DataSource
import { DataSource } from 'typeorm';
constructor(
private readonly dataSource: DataSource,
) {}
- Start Transaction
const qr = this.dataSource.createQueryRunner();
await qr.connect();
await qr.startTransaction(); // startTransaction() 격리 수준 설정 가능
- Transaction setting
try {
const director = await qr.manager.findOne(Director, {
where: { id: createMovieDto.directorId },
});
if (!director) {
throw new NotFoundException('존재하지 않는 감독입니다.');
}
// genreIds 여러 개를 찾아온다.
const genres = await qr.manager.find(Genre, {
where: { id: In(createMovieDto.genreIds) },
});
if (genres.length !== createMovieDto.genreIds.length) {
throw new NotFoundException(
`존재하지 않는 장르가 있습니다. 존재하는 ids -> ${genres.map((genre) => genre.id)}`,
);
}
const movieDetail = await qr.manager.save(MovieDetail, {
detail: createMovieDto.detail,
});
const movie = await qr.manager.save(Movie, {
title: createMovieDto.title,
movieDetail: movieDetail,
director: { id: createMovieDto.directorId },
genres,
});
await qr.commitTransaction(); // 트랜잭션 Commit 데이터베이스에 반영
return movie;
} catch (error) {
await qr.rollbackTransaction(); // 에러 사항 생기면 전체 복구
throw error;
} finally {
await qr.release(); // 꼭 실행
}
- qr.manager.Repository method(Entity,{})
manager를 통해 Entity에 설정할 수 있다.
- await qr.commitTransaction(); 트랜잭션이 모두 끝나면 데이터베이스에 반영되낟.
- await qr.rollabackTransaction(); 트랜잭션 실행 도중 에러가 발생하면 모두 되돌아간다.