저장을 습관화

NestJS - TypeORM 트랜잭션 본문

공부/node.js

NestJS - TypeORM 트랜잭션

ctrs 2023. 12. 28. 17:38

문법 기록

하나의 메소드에서 복수의 DB를 향해 쿼리를 전송하던 도중

DB 연결 오류 등의 에러로 쿼리가 누락되는 문제를 방지하기 위함

 

- examples.service.ts

import { DataSource } from 'typeorm';
import { Examples } from './example.entity';

@Injectable()
export class ExamplesService {
  constructor(
    @InjectRepository(Examples) private examplesRepository: Repository<Examples>,
    private dataSource: DataSource,
  ) {}
  
  async exampleMethod() {
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect(); // DB 연결
    await queryRunner.startTransaction(); // 트랜잭션 시작
    
    try {
      await queryRunner.manager
        .getRepository(Examples)
        .save({ /* DB 컬럼: 전달 인자 */ });
      // 이외의 쿼리 1
      // 이외의 쿼리 2
      // 이외의 쿼리 3
        
      await queryRunner.commitTransaction(); // 트랜잭션 내 변경 내용 커밋 및 완료
      return true;
    } catch (error) {
      console.log(error);
      await queryRunner.rollbackTransaction(); // 트랜잭션 실행 전으로 롤백
      throw error;
    } finally {
      await queryRunner.release(); // DB 연결 종료
    }
    
  }
}

 

예를들어 쿼리 2에서 에러가 발생한다면 

이전에 정상적으로 완료되었던 .getRepository(Examples).save({}), 쿼리 1를 진행하기 전으로 롤백함