> ## 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 統計資料交易式寫入，以不可部分完成的方式更新多個玩家統計資料，並在進度更新之間保持一致性。

# 交易式寫入

在本教學課程中，我們將說明如何對統計資料執行交易式寫入。根據用來儲存統計資料的程序，開發人員可能會遇到可能導致作業重複的案例，特別是使用 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` 參數。此參數可作為正在執行之要求的識別碼。每次有新要求到達時，系統都會將新的交易識別碼與已處理過的識別碼進行比較。如果找到相符項目，就不會執行該要求。

需要考量的一個關鍵層面是，此交易式行為會在 `TransactionId` 與正在執行的要求之間建立關聯，而不是與該要求中的個別統計資料建立關聯。沒有針對每個個別統計資料的對應；對應是針對整個要求。此外，使用此功能時，我們有不同的計量來追蹤此類型的要求，請在此深入了解：[統計資料計量](/zh-TW/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`：此參數對應於您可以新增至一個實體的分數清單。請記住，統計資料可以有多個資料行。您可以在此深入查看這些概念：[統計資料的進階運用](/zh-TW/services/playfab/player-progression/statistics/doing-more-statistics)
  * `Name`：此參數對應於您建立統計資料定義時所設定的統計資料名稱。

了解這些概念後，您現在已準備好將資料新增至統計資料，並避免要求重複。

## 另請參閱

* [建立基本統計資料](/zh-TW/services/playfab/player-progression/statistics/create-basic-statistics)。
* [統計資料的進階運用](/zh-TW/services/playfab/player-progression/statistics/doing-more-statistics)。
* [季節性統計資料](/zh-TW/services/playfab/player-progression/statistics/seasonal-statistics)。
* [將內容資料新增至統計資料](/zh-TW/services/playfab/player-progression/statistics/metadata-statistics)。
* [API 參考](/zh-TW/services/playfab/player-progression/statistics/api-reference)。
* [限制](/zh-TW/services/playfab/player-progression/statistics/limits-statistics)。
* [配額](/zh-TW/services/playfab/player-progression/statistics/quota-statistics)
* [統計資料計量](/zh-TW/services/playfab/pricing/meters/statistics-meters)。


## Related topics

- [統計資料計量](/zh-TW/services/playfab/pricing/meters/statistics-meters.md)
- [中繼資料統計資料](/zh-TW/services/playfab/player-progression/statistics/metadata-statistics.md)
- [統計資料的進階運用](/zh-TW/services/playfab/player-progression/statistics/doing-more-statistics.md)
- [建立基本統計資料](/zh-TW/services/playfab/player-progression/statistics/create-basic-statistics.md)
- [季節性統計資料](/zh-TW/services/playfab/player-progression/statistics/seasonal-statistics.md)
