4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

typeormのtransactionのちょいメモ

Posted at

前段

typeormにてsave後にfindした値を戻り値に使いたいケースがあった。
DBの構成がmaster/slaveになっているためレプリケーションに若干のタイムラグがあった(100msecとか)。
そのためsaveした内容がslaveに反映される前にslaveからfindしてしまい、更新前の値を返却してしまうというケースが発生した。

内容

transactionを利用することでmasterへのsave, masterからのfindが実行されることになりこの問題は解決した。
以下サンプルコード

  • before
async updateHoge(params: { id: string } & Partial<HogeEntity>): Promise<HogeEntity> {
  const existed = await this.hogeRepository.findOne({ id: params.id });
  if (!existed) {
    throw new Error(`invalid id: ${params.id}`);
  }

  const updatedParams = {
    ...existed,
    ...params,
  };

  await this.hogeRepository.save(updatedParams);

  const updated = await this.hogeRepository.findOne({ id: params.id });
  if (!updated) {
    throw new Error(`invalid id: ${params.id}`);
  }

  return updated;
}
  • after
@Transaction('test')
async updateHoge(
  params: { id: string } & Partial<HogeEntity>,
  @TransactionRepository(HogeEntity) hogeRepository?: Repository<HogeEntity>,
): Promise<HogeEntity> {
  if (hogeRepository === undefined) {
    throw new Error('Transaction repository does not exist');
  }

  const existed = await hogeRepository.findOne({ id: params.id });
  if (!existed) {
    throw new Error(`invalid id: ${params.id}`);
  }

  const updatedParams = {
    ...existed,
    ...params,
  };

  await hogeRepository.save(updatedParams);

  const updated = await hogeRepository.findOne({ id: params.id });
  if (!updated) {
    throw new Error(`invalid id: ${params.id}`);
  }

  return updated;
}
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?