Amazon Web Services ブログ

C# を使用した Amazon DynamoDB でのネストされたトランザクションの有効化

本記事は 2026 年 03 月 31 日 に公開された “Enabling nested transactions in Amazon DynamoDB using C#” を翻訳したものです。翻訳は Solutions Architect の嶋田 朱里が担当しました。

Amazon DynamoDB は、あらゆる規模の高性能アプリケーション向けに設計された、フルマネージド型のサーバーレス NoSQL データベースサービスです。この記事では、C# を使用して DynamoDB で ACID (原子性、一貫性、分離性、永続性) 準拠のトランザクションを管理するフレームワークを紹介します。このフレームワークは、ネストされたトランザクションのサポートを特徴としています。この機能により、.NET アプリケーション内でデータの一貫性とエラー処理をより細かく制御しながら、洗練されたロジックを実装できます。このネストされたトランザクションフレームワークを使用すると、問題を分離し、部分的なロールバックを可能にし、DynamoDB の組み込みトランザクション機能の上に保守可能でモジュール化されたワークフローを構築できます。

トランザクションフレームワークのおさらい

ネストされたトランザクションに入る前に、このトランザクションフレームワークが何をするのかを簡単に振り返りましょう。Amazon DynamoDB トランザクションフレームワーク は、DynamoDB の組み込みトランザクション機能を使った作業を効率化する C# ライブラリです。このフレームワークは以下を提供します。

  • トランザクションのライフサイクル (開始、コミット、ロールバック) を管理する TransactScope クラス
  • 複数の DynamoDB テーブルにわたる ACID 準拠の操作の効率化
  • DynamoDB の TransactWriteItems および TransactGetItems API の低レベルの詳細 (複数のネストされたレベルにわたるトランザクションの調整やリクエストの構築など) を管理する抽象化レイヤー
  • フレームワークに組み込まれたエラー処理と再試行ロジック

このフレームワークは、複数の関連するデータアイテムを扱う場合でも、データの一貫性を維持する信頼性の高いアプリケーションの構築を支援します。在庫管理、金融取引、ユーザープロファイルの更新、または複数の DynamoDB 操作が単一のユニットとして成功または失敗する必要があるあらゆる状況で使用できます。

ネストされたトランザクションが重要な理由

ネストされたトランザクションにより、トランザクション操作を親トランザクションのスコープ内に存在させることができます。この機能は、エンタープライズグレードのシステムにおける柔軟性と堅牢性を向上させます。たとえば、システム内のモジュール化されたコンポーネントは、親トランザクション構造に影響を与えることなく独自のロジックをカプセル化でき、プロセスの一部で問題が発生した場合に部分的なロールバックを実行できます。エラーの影響範囲を発生元のトランザクション内に閉じ込めることで、ネストされたトランザクションはトランザクション全体の失敗のリスクを軽減し、フォールトトレランスを向上させ、システムのデバッグと保守をより容易にします。

サンプルアプリケーションの概要

ネストされたトランザクションを実際にどのように使用できるかを示すために、フレームワークの機能を紹介する サンプル Windows Forms アプリケーション を作成しました。このアプリケーションでは、複数レベルのネストされたトランザクションを通じてトランザクションの整合性を維持しながら、さまざまな製品タイプに対して一般的なデータ操作 (作成、削除、取得) を実行できます。

このサンプルアプリケーションは、ネストされたトランザクションが特に有効な、いくつかの一般的なシナリオを想定して作られています。

  • 複雑なビジネスワークフロー : 複数の関連アイテム (e コマースの注文プロセスやコンテンツ管理の更新など) に変更を加える必要がある場合
  • エラーの分離 : プロセス全体をロールバックすることなく、特定の操作グループ内で障害を封じ込めたい場合
  • モジュール化されたシステム統合 : システムのさまざまなコンポーネントが独自のトランザクションコンテキストを維持する必要がある場合

次の画像の UI アプリケーションは、ネストされたトランザクションフレームワークを使用する DynamoDB Transaction Example というタイトルのフォームを提供します。これは、ネストされたトランザクションの仕組みを使って書籍、アルバム、映画を管理します。

Form

主要な手順の流れは次のとおりです。

  1. 書籍、アルバム、映画用の DynamoDB テーブルを初期化するには、Create Product Tables (Book, Album, Movie) を選択します。これは通常、管理者として処理する 1 回限りのセットアップ手順です。
  2. テーブルが配置されたら、Product Type ドロップダウンメニューから AlbumBook、または Movie を選択します。この選択により、フォームフィールドが製品の属性に合わせてカスタマイズされます。たとえば、Album を選択すると Album ArtistTitle の入力が求められ、Movie では DirectorGenre が求められます。
  3. 対応する製品の詳細を入力します。これらの詳細は、選択した製品カテゴリによって異なります。たとえば、書籍には著者名、タイトル、およびオプションで出版日が必要であり、映画には監督名、タイトル、ジャンルが必要です。フォームでは、製品エントリの追加、削除、取得を含むトランザクション操作を実行するオプションが提供されます。

このアプリでは、ネストされたトランザクションを使用して、複数のトランザクションを開始し、それぞれのトランザクション内でアイテムの追加や削除を行い、個別にコミットまたはロールバックできます。また、ネストされたトランザクションフレームワークの動作を確認できるよう、親トランザクションと子トランザクションの間を行き来できるナビゲーション機能も備えています。これにより、どの操作をどのトランザクションにまとめるかを細かく制御できます。現在のトランザクションの階層は括弧内の数字で表示され (たとえば、Transaction (1))、Commit TransactionRollback Transaction などの操作は、現在の階層とその配下の子トランザクションに対して適用されます。

Album ArtistTitle などのキーを提供することで、オプションで製品データを取得できます (Retrieve Item を選択)。すべての応答 (成功メッセージ、エラー通知、または取得されたデータ) は、Response Message フィールドと対応する製品属性ボックスに表示されます。

次の図は、DynamoDB でのネストされたトランザクションのシーケンスフローを示しています。親と子のトランザクションスコープがどのように相互作用して分離されたアトミック操作を提供するかを示しています。

Sequence diagram

フレームワークアーキテクチャ

このフレームワークは、TransactScope クラスを強化し、Composition や Chain of Responsibility などのデザインパターンを採用することで、ネストされたトランザクションをサポートします。

コミット操作は後入れ先出し (LIFO) の順序に従い、親の前に子の TransactScope を処理します。また、ロールバック操作も下位へと順次伝播するため、障害発生時には完全にクリーンアップされます。このシステムはスコープ間の双方向移動を可能にし、複雑なトランザクションフローの管理をより簡単にします。

アーキテクチャの適用性に関する注意: ここで提示されるフレームワークアーキテクチャ設計は、上記のサンプルアプリケーションでは C# で実装されていますが、他のすべてのオブジェクト指向プログラミング言語とプラットフォームに適用され、設計原則の幅広い適用性を保証します。

次の図は、カスタム TransactScope クラス構造を使用したネストされたトランザクションモデルを示しています。_transactRequest プロパティは TransactWriteItemsRequest を保持し、DynamoDB の複数の書き込み操作 (Put、Update、Delete) を単一のトランザクションにバッチ処理するために使用されます。_childTransactScopeTransactScope (具体的には子スコープ) を指し、この TransactScope 内にネストされたトランザクションが存在することを示します。逆に、_parentTransactScope は親の TransactScope を指し、トランザクション間の親子関係を確立します。

Frame architect

レイヤードアーキテクチャ

アプリケーションでネストされたトランザクションフレームワークを効果的に使用するには、そのレイヤードアーキテクチャを理解することが役立ちます。この設計は責務の分離を提供し、コードの保守性とテストのしやすさを向上させます。アーキテクチャは 4 つの主要なレイヤーで構成されています。

  • UI レイヤー : Windows Forms インターフェイスは、トランザクションの開始と管理のエントリポイントとして機能します。サービスレイヤーのメソッドを呼び出して、BeginTransaction()、CommitTransactionAsync()、RollbackTransaction() を実行し、トランザクションのライフサイクルを制御します。
  • サービスレイヤー : ProductServiceTransactScope を含むこのレイヤーは、トランザクションのオーケストレーションを管理します。ネストされたスコープ間を作成およびナビゲートし、トランザクションロジックを一元化します。これは、トランザクション管理コードの大部分が存在する場所です。
  • データアクセスレイヤー : ここで、ProductProvider は、サービスレイヤーによって提供されるトランザクションコンテキスト内で、挿入や削除などのデータ操作を実行します。このレイヤーで、ドメインオブジェクトの特定のデータアクセスロジックを実装します。
  • DynamoDB : 最下層では、DynamoDB が組み込みトランザクション API (TransactWriteItems) を通じてアトミックな実行をサポートし、すべての操作が成功するか、いずれも成功しないことを保証します。

設計のハイライト

ワークフローは、使いやすさと堅牢性を向上させるコア機能を備えて設計されており、主に Begin/Commit/Rollback 構造を通じて実現されています。これにより、操作をアトミック (すべて成功するか、いずれも成功しない) にすることで、DynamoDB でのトランザクションの整合性と一貫性が保証されます。さらに、ネストされたトランザクションを使用する機能により、親スコープと子スコープを簡単に切り替えることで、より複雑でモジュール化されたワークフローが可能になります。

インターフェイスは、アクションを追跡するのに役立つ動的なフィードバックも提供します。トランザクションの深さインジケーター (括弧内に表示) は、操作がステージングされるにつれて更新され、ワークフローの現在の状態に関する明確な洞察を提供します。最後に、システムは統一されたインターフェイス内で複数の製品タイプ (書籍、アルバム、映画) をサポートします。これにより、同じトランザクションスコープ内で複数の DynamoDB テーブルにわたってアイテムを追加、削除、取得できます。サービスレイヤーでの一元化されたトランザクション管理により、責任が明確に分離され、DynamoDB が原子性を提供します。このレイヤードアプローチは、実世界のアプリケーションに必要な柔軟性を提供しながら、保守性を向上させます。

ネストされたトランザクションのベストプラクティス

アプリケーションでこの設計を最大限に活用するには、次の実用的なガイドラインに従ってください。

  1. DynamoDB の制限に注意するDynamoDB の制限 (100 アイテム、トランザクションあたり 4 MB) 内に収まるように、トランザクションを短く保ちます。それに応じてデータモデルを計画してください。
  2. 再試行ロジックを実装する : DynamoDB トランザクションは、条件チェック、競合、または容量の問題により失敗する可能性があります。指数バックオフを使用した効果的な再試行メカニズムをアプリケーションに組み込んでください。
  3. パフォーマンスを監視する : Amazon CloudWatch アラームを設定して、トランザクション競合率、レイテンシー、例外などのトランザクションメトリクスを追跡し、ボトルネックを早期に特定します。
  4. ネストの深さを制限する : ネストされたトランザクションは柔軟性を提供しますが、過度のネスト (3 〜 4 レベルを超える) は、デバッグと保守が困難な過度に複雑な実行パスを作成する可能性があります。

実世界のユースケース

フレームワークを理解したところで、独自のアプリケーションでネストされたトランザクションを適用できるいくつかの実用的なシナリオについて説明しましょう。

  1. e コマースの注文処理 : 顧客が注文を行う場合、在庫レベルの更新、支払い情報の処理、注文レコードの作成が必要になる場合があります。ネストされたトランザクションを使用すると、支払い処理をサブトランザクションに分離でき、支払いが失敗した場合に独立してロールバックできます。
  2. 複数ステップのユーザー登録 : 初期ユーザープロファイルの作成、セキュリティ検証、アカウントの最終化など、複数の検証ステップを含む複雑な登録プロセスがアプリケーションに必要な場合、ネストされたトランザクションを使用して各段階の進行状況を追跡しながら、必要に応じて特定のステップをロールバックする機能を維持できます。
  3. コンテンツ管理システム : 複数の関連エンティティ (記事、著者、カテゴリなど) への更新を必要とするコンテンツを公開する場合、ネストされたトランザクションは、特定のドメイン内で部分的な操作を可能にしながら一貫性を維持するのに役立ちます。
  4. 金融アプリケーション : 複数のアカウントや金融商品を含む操作の場合、ネストされたトランザクションは、アカウント管理コンテキスト、トランザクション処理コンテキスト、データ整合性コンテキストなどの特定の操作コンテキストを分離しながら、一貫性を提供するために必要なきめ細かい制御を提供します。

まとめ

この記事では、C# を使用した Amazon DynamoDB でのネストされたトランザクションフレームワークを紹介しました。これにより、トランザクションワークフローでの制御と堅牢性が向上します。TransactScope クラスを拡張することで、このソリューションは、コミットとロールバックの動作をより細かく制御しながら、複雑でモジュール化されたビジネス操作をモデル化する柔軟性を提供します。構造化された UI ワークフローと、UI レイヤー、サービスレイヤー、データアクセスレイヤーにまたがるレイヤードアーキテクチャは、すべての製品関連操作にわたってトランザクションの整合性、分離性、一貫性を提供します。

この実装の完全なソースコードは、GitHub リポジトリ で入手できます。


著者について

Jeff Chen

Jeff Chen

Jeff は、AWS Professional Services のプリンシパルコンサルタントであり、生成 AI を活用したアプリケーションのモダナイゼーションと移行プロジェクトを通じて顧客を支援することを専門としています。生成 AI 以外にも、DevOps、データ分析、インフラストラクチャプロビジョニング、セキュリティなど、さまざまなドメインにわたってビジネス価値を提供し、組織が戦略的なクラウド目標を達成できるよう支援しています。