Skip to content

refactor: Repository内トランザクションをrunInTransaction/getClient経由に統一#127

Draft
Mel-906 wants to merge 7 commits intofeature/unit-of-workfrom
feature/uow-repository-transaction
Draft

refactor: Repository内トランザクションをrunInTransaction/getClient経由に統一#127
Mel-906 wants to merge 7 commits intofeature/unit-of-workfrom
feature/uow-repository-transaction

Conversation

@Mel-906
Copy link
Copy Markdown

@Mel-906 Mel-906 commented Mar 28, 2026

Summary

PR1(#126)で導入したUoW基盤(runInTransaction / getClient)を活用し、各Repositoryのトランザクション処理を統一します。

変更内容

対象 Before After
DrizzleMemberRepository.save() db.transaction(tx => ...)tx を直接操作 runInTransaction(() => { getClient()... })
DrizzleDiscordAccountRepository.save() 同上 同上
DrizzleKarteRepository.save() 同上 同上
DrizzleEventRepository.persistEvent() トランザクションなし(5つのDB操作が非原子的) runInTransaction() で囲み原子性を確保

背景

  • UoWとの統合: 既存の db.transaction(tx) パターンでは、UseCaseレベルの UnitOfWork.run() で開始したトランザクションに乗ることができない。runInTransaction + getClient() に統一することで、UoWトランザクション内で呼ばれた場合はそれに乗り、単独で呼ばれた場合は自前でトランザクションを開始する
  • EventRepositoryの原子性: persistEvent() は event upsert → 不要exhibit削除 → exhibit upsert → memberEvents同期 → memberExhibits同期 の5操作がトランザクションなしで実行されており、途中失敗時にデータ不整合が起きうる状態だった

確認

  • Member・DiscordAccount・Karteのsave()が引き続き正しく動作すること: db.transaction(tx) → runInTransaction + getClient() への書き換えによるリグレッションがないこと
  • persistEvent()の部分失敗時に全操作が巻き戻ること: 5つのDB操作の途中で例外が発生した場合、それ以前の書き込みが残らないこと(今回新たにトランザクションで囲んだ箇所)
  • UnitOfWork.run()内から呼んだ場合に外側のトランザクションに合流すること: Repository単独のトランザクションが二重に開始されず、UoW単位で一括コミット/ロールバックされること

テストは現在未実行です。挑戦してみます

🤖 Generated with Claude Code

Mel-906 and others added 3 commits March 27, 2026 00:06
複数の集約をまたぐDB操作をトランザクションで安全にまとめるための仕組みを追加。
AsyncLocalStorageによりRepository側のコード変更なしでトランザクションを共有できる。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ient にリネーム

生成・取得しているのはDBそのものではなくDrizzleクライアントであるため、
実態に合った命名に修正。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PgTransactionはPgDatabaseを継承しているため、DrizzleClientを
PgDatabase<NodePgQueryResultHKT, typeof schema>で定義することで
DB接続とトランザクションを同じ型として扱えるようになった。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Mel-906 Mel-906 requested a review from KinjiKawaguchi March 28, 2026 16:19
Copy link
Copy Markdown
Member

@KinjiKawaguchi KinjiKawaguchi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Mel-906 テストコードのdiffが #127 に混ざってしまってるようです。

@KinjiKawaguchi
Copy link
Copy Markdown
Member

CICDも通せると嬉しいです

Mel-906 and others added 2 commits April 2, 2026 21:43
Member・DiscordAccount・KarteのRepository.save()でdb.transaction(tx)を
直接使っていた箇所をrunInTransaction + getClient()に置き換え、
UoWトランザクションが開始されていればそれに乗るようにした。
EventRepository.persistEvent()はトランザクションなしだった5つのDB操作を
runInTransaction()で囲み、集約単位の原子性を確保した。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Mel-906 Mel-906 force-pushed the feature/uow-repository-transaction branch from b74198a to 44cd950 Compare April 2, 2026 13:19
@Mel-906
Copy link
Copy Markdown
Author

Mel-906 commented Apr 2, 2026

@Mel-906 テストコードのdiffが #127 に混ざってしまってるようです。

cherrypick , rebase 等で対応してみました。

CI/CDについてもチェック通ってそうです。

Copy link
Copy Markdown
Member

@KinjiKawaguchi KinjiKawaguchi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@Mel-906 Mel-906 force-pushed the feature/unit-of-work branch from eb138a9 to a90e539 Compare April 24, 2026 16:50
Mel-906 added 2 commits April 25, 2026 03:11
…tory-transaction

# Conflicts:
#	src/infrastructure/drizzle/client.ts
…re/uow-repository-transaction

# Conflicts:
#	src/infrastructure/drizzle/DrizzleDiscordAccountRepository.ts
#	src/infrastructure/drizzle/DrizzleEventRepository.ts
#	src/infrastructure/drizzle/DrizzleKarteRepository.ts
#	src/infrastructure/drizzle/DrizzleMemberRepository.ts
#	src/infrastructure/drizzle/client.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants