前回
TypeORM トランザクション
TypeORMでトランザクションを処理することができます。
src/user/user.service.ts
import { Injectable } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { DataSource, DeleteResult, Repository } from "typeorm"; import { CreateUserDto } from "./dto/create-user.dto"; import { UpdateUserDto } from "./dto/update-user.dto"; import { User } from "./entities/user.entity"; @Injectable() export class UserService { constructor( @InjectRepository(User) private userRepository: Repository<User>, private dataSource: DataSource ) {} create(createUserDto: CreateUserDto) { return "This action adds a new user"; } async createMany(users: User[]) { const queryRunner = this.dataSource.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { await queryRunner.manager.save(users[0]); await queryRunner.manager.save(users[1]); await queryRunner.commitTransaction(); } catch (error) { await queryRunner.rollbackTransaction(); } finally { await queryRunner.release(); } } findAll(): Promise<User[]> { return this.userRepository.find(); } findOne(id: number): Promise<User> { return this.userRepository.findOneBy({ id }); } update(id: number, updateUserDto: UpdateUserDto) { return `This action updates a #${id} user`; } async remove(id: number): Promise<DeleteResult> { return await this.userRepository.delete(id); } }
まず、コンストラクタでprivate dataSource: DataSource
をDIします。
次に、async createMany(users: User[])
を実装します。
そこで、this.dataSource.createQueryRunner()
からqueryRunner
を生成し、await queryRunner.connect();
、await queryRunner.startTransaction();
にて、処理を開始します。
その後、await queryRunner.manager.save
で書き込みを行い、await queryRunner.commitTransaction
でトランザクションをコミットします。
失敗した場合は、await queryRunner.rollbackTransaction()
でロールバックを行います。
いずれの場合も、await queryRunner.release()
でコネクションをリリースします。
まとめ
ここまでで、
- TypeORM トランザクションについて
を学びました。
次回もデータベース操作を掘り下げようと思います。
コード
今回のコードは、以下に格納しました。