> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# トランザクション書き込み

> PlayFab Statistics のトランザクション書き込みを使用して、複数のプレイヤー統計情報をアトミックに更新し、進捗更新全体で一貫性を維持します。

# トランザクション書き込み

このチュートリアルでは、統計情報に対してトランザクション書き込みを実行する方法について説明します。統計情報を保存するために使用するプロセスによっては、特に SUM 集計に関して、操作が重複する可能性のあるシナリオに遭遇することがあります。これらの複雑なシナリオに対処するために、トランザクション書き込み機能を追加しました。

多くのマッチが同時にプレイされているマルチプレイヤーゲームの例から始めます。このゲームは、各マッチに対して大量の統計情報とその他のテレメトリ値を保存します。プレイヤーエクスペリエンスを妨げないために、スタジオはリアルタイムではなく 10 分ごとに統計情報をプッシュすることに決めました。

このアプローチにより、あるマッチから別のマッチへと移動するプレイヤーにシームレスなエクスペリエンスが確保されます。しかし、新しい技術的課題が生じます。10 分ごとにリクエストを実行するためのキューが必要になります。しかし、何らかの理由でキュー内のイベントを再生したい場合はどうなるでしょうか？その場合、特に SUM 集計を持つ統計情報がある場合、二重カウントを避ける必要があるため、課題が発生する可能性があります。

このコンテキストを念頭に置いて、この特定の問題を解決する方法を示します。

## 統計情報の定義を作成する

まずは統計情報の定義を作成します。このレベルでは、トランザクション書き込みのために特別な設定を追加する必要はありません。

```C# theme={null}
public static async Task CreateStatisticDefinitionAsync(PlayFabAuthenticationContext context, string statName)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateStatisticDefinitionRequest statDefinitionRequest = new CreateStatisticDefinitionRequest()
    {
        Name = statName,
        AuthenticationContext = context,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<StatisticColumn>()
        {
            new StatisticColumn()
            {
                Name = "Eliminations",
                AggregationMethod = StatisticAggregationMethod.Sum,
            },
             new StatisticColumn()
            {
                Name = "Caliber",
                AggregationMethod = StatisticAggregationMethod.Min,
            }
        },
    };
    
    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createStatDefResult = await statsAPI.CreateStatisticDefinitionAsync(statDefinitionRequest);
}
```

## 統計情報にデータを追加する

例を続けて、先に定義した統計情報にデータを追加します。通常のリクエストとこのリクエストの主な違いは、特別な `TransactionId` パラメーターです。このパラメーターは、実行中のリクエストの識別子として機能します。新しいリクエストが到着するたびに、システムは新しいトランザクション ID と既に処理された識別子を比較します。一致するものが見つかった場合、リクエストは実行されません。

考慮すべき重要な側面として、このトランザクション動作は `TransactionId` と実行中のリクエストの間に関係を確立するもので、そのリクエスト内の個々の統計情報とではないことです。個々の統計情報ごとにマッピングがあるわけではなく、マッピングはリクエスト全体に対するものです。また、この機能を使用する場合、この種類のリクエストを追跡するための別のメーターがあります。詳細については、こちらをご覧ください: [統計情報メーター](/services/playfab/pricing/meters/statistics-meters)

```C# theme={null}
public static async Task UpdateStatisticForPlayer(PlayFabAuthenticationContext context, string statName, string entityId, int eliminationScore, int caliberScore)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateStatisticsRequest updateStatRequest = new UpdateStatisticsRequest()
    {
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        AuthenticationContext = context,
        TransactionId = "YOUR_OWN_IDENTIFIER"
        Statistics = new List<PlayFab.LeaderboardsModels.StatisticUpdate>() 
        {
            new PlayFab.LeaderboardsModels.StatisticUpdate() 
            {
                Name = statName,
                Scores = new List<string> { eliminationScore.ToString(), caliberScore.ToString()},
            }
        }
    };

    PlayFabResult<UpdateStatisticsResponse> updateResult = await statsAPI.UpdateStatisticsAsync(updateStatRequest);
}
```

それでは、この例の主要な要素について説明します。

* `Entity`: このパラメーターは、統計情報を更新したいエンティティに対応します。
* `TransactionId`: このパラメーターは、リクエストの一意の識別子を表す文字列に対応します。
* `Statistics`: このパラメーターは、エンティティの実際の統計情報のセットに対応します。
* `StatisticUpdate`: このパラメーターは、追加される統計情報の値に対応します。
  * `Scores`: このパラメーターは、1 つのエンティティに追加できるスコアのリストに対応します。統計情報には複数の列があることを覚えておいてください。これらの概念については、こちらで詳しく確認できます: [統計情報でさらに多くのことを行う](/services/playfab/player-progression/statistics/doing-more-statistics)
  * `Name`: このパラメーターは、統計情報の定義を作成したときに設定した統計情報の名前に対応します。

これらの概念が明確になったので、統計情報にデータを追加し、リクエストの重複を回避する準備ができました。

## 関連項目

* [基本的な統計情報を作成する](/services/playfab/player-progression/statistics/create-basic-statistics)
* [統計情報でさらに多くのことを行う](/services/playfab/player-progression/statistics/doing-more-statistics)
* [シーズナル統計情報](/services/playfab/player-progression/statistics/seasonal-statistics)
* [統計情報にコンテキストデータを追加する](/services/playfab/player-progression/statistics/metadata-statistics)
* [API リファレンス](/services/playfab/player-progression/statistics/api-reference)
* [制限](/services/playfab/player-progression/statistics/limits-statistics)
* [クォータ](/services/playfab/player-progression/statistics/quota-statistics)
* [統計情報メーター](/services/playfab/pricing/meters/statistics-meters)
