> ## 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.

# Gravações transacionais

> Use as gravações transacionais do PlayFab Statistics para atualizar várias estatísticas de jogadores de forma atômica e preservar a consistência entre as atualizações de progressão.

# Gravações transacionais

Neste tutorial, vamos explicar como executar uma gravação transacional em uma estatística. Dependendo do
processo usado para armazenar as estatísticas, os desenvolvedores podem encontrar cenários que resultem na duplicação de
uma operação, em particular com a agregação SUM. Para lidar com esses cenários complexos, adicionamos o recurso de gravação transacional.

Vamos começar com um exemplo envolvendo um jogo multijogador com muitas partidas sendo jogadas simultaneamente.
Esse jogo armazena um grande número de estatísticas e outros valores de telemetria para cada partida. Para evitar prejudicar
a experiência do jogador, o estúdio decidiu enviar as estatísticas a cada 10 minutos, em vez de em tempo real.

Essa abordagem garante uma experiência contínua para os jogadores que passam de uma partida para outra. No entanto, ela
introduz novos desafios técnicos. Agora precisamos de uma fila para executar as solicitações a cada 10 minutos. Mas o que
acontece se quisermos reproduzir os eventos da fila por algum motivo? Nesse caso, podemos ter um desafio,
especialmente se tivermos estatísticas com agregação SUM, pois precisamos evitar a contagem dupla.

Com esse contexto em mente, vamos mostrar como resolver esse problema específico.

## Criando uma definição de estatística

Vamos começar criando uma definição de estatística; neste nível, não precisamos adicionar nenhuma configuração
especial para as gravações transacionais.

```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);
}
```

## Adicionando dados a uma estatística

Continuando com nosso exemplo, vamos adicionar dados à estatística definida anteriormente. A principal diferença
entre uma solicitação normal e esta é o parâmetro especial `TransactionId`. Esse parâmetro serve como um
identificador da solicitação que está sendo executada. Sempre que uma nova solicitação chega, o sistema compara as novas
IDs de transação com os identificadores que já foram processados. Se for encontrada uma correspondência, a solicitação não será executada.

Um aspecto importante a considerar é que esse comportamento transacional estabelece uma relação entre o
`TransactionId` e a solicitação que está sendo executada, e não com as estatísticas individuais dessa solicitação.
Não há um mapeamento para cada estatística individual; o mapeamento é para a solicitação inteira. Além disso, quando esse recurso
está sendo usado, temos um medidor diferente para acompanhar esse tipo de solicitação; saiba mais aqui: [Medidores de estatísticas](/pt-BR/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);
}
```

Agora, vamos explicar alguns elementos principais deste exemplo:

* `Entity`: este parâmetro corresponde à entidade a partir da qual queremos fazer a atualização da estatística.
* `TransactionId`: este parâmetro corresponde a uma cadeia de caracteres que representa um identificador exclusivo da solicitação.
* `Statistics`: este parâmetro corresponde ao conjunto real de estatísticas de uma entidade.
* `StatisticUpdate`: este parâmetro corresponde aos valores das estatísticas que serão adicionados.
  * `Scores`: este parâmetro corresponde à lista de pontuações que você pode adicionar a uma entidade. Lembre-se de que as estatísticas podem ter mais de uma coluna.
    Você pode conferir esses conceitos em detalhes aqui: [Fazendo mais com estatísticas](/pt-BR/services/playfab/player-progression/statistics/doing-more-statistics)
  * `Name`: este parâmetro corresponde ao nome da estatística definido ao criar a definição de estatística.

Com esses conceitos claros, agora você está pronto para adicionar dados à sua estatística e evitar qualquer duplicação nas suas solicitações.

## Confira também

* [Criar estatísticas básicas](/pt-BR/services/playfab/player-progression/statistics/create-basic-statistics).
* [Fazendo mais com estatísticas](/pt-BR/services/playfab/player-progression/statistics/doing-more-statistics).
* [Estatísticas sazonais](/pt-BR/services/playfab/player-progression/statistics/seasonal-statistics).
* [Adicionar dados contextuais às estatísticas](/pt-BR/services/playfab/player-progression/statistics/metadata-statistics).
* [Referência de API](/pt-BR/services/playfab/player-progression/statistics/api-reference).
* [Limites](/pt-BR/services/playfab/player-progression/statistics/limits-statistics).
* [Cota](/pt-BR/services/playfab/player-progression/statistics/quota-statistics)
* [Medidores de estatísticas](/pt-BR/services/playfab/pricing/meters/statistics-meters).


## Related topics

- [Medidores de estatísticas](/pt-BR/services/playfab/pricing/meters/statistics-meters.md)
- [Fazendo mais com estatísticas](/pt-BR/services/playfab/player-progression/statistics/doing-more-statistics.md)
- [Estatísticas com metadados](/pt-BR/services/playfab/player-progression/statistics/metadata-statistics.md)
- [Criar uma estatística básica](/pt-BR/services/playfab/player-progression/statistics/create-basic-statistics.md)
- [Estatísticas sazonais](/pt-BR/services/playfab/player-progression/statistics/seasonal-statistics.md)
