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

# Escrituras de transacción

> Use las escrituras transaccionales de las estadísticas de PlayFab para actualizar varias estadísticas de jugador de forma atómica y preservar la coherencia entre las actualizaciones de progresión.

# Escrituras transaccionales

En este tutorial, vamos a explicar cómo realizar una escritura transaccional en una estadística. Según el
proceso utilizado para almacenar estadísticas, los desarrolladores pueden encontrarse con escenarios que podrían dar lugar a la duplicación de
una operación, en particular con la agregación SUM. Para abordar estos escenarios complejos, agregamos la característica de escritura transaccional.

Vamos a comenzar con un ejemplo de un juego multijugador con muchas partidas jugándose simultáneamente.
Este juego almacena una gran cantidad de estadísticas y otros valores de telemetría para cada partida. Para evitar interrumpir
la experiencia de los jugadores, el estudio decidió enviar las estadísticas cada 10 minutos en lugar de en tiempo real.

Este enfoque garantiza una experiencia fluida para los jugadores que pasan de una partida a otra. Sin embargo,
introduce nuevos desafíos técnicos. Ahora necesitamos una cola para ejecutar solicitudes cada 10 minutos. Pero ¿qué
sucede si queremos reproducir de nuevo los eventos de la cola por cualquier motivo? Entonces podríamos tener un desafío,
especialmente si tenemos estadísticas con agregación SUM, ya que necesitamos evitar el recuento doble.

Con este contexto en mente, vamos a mostrar cómo resolver este problema concreto.

## Creación de una definición de estadística

Vamos a comenzar creando una definición de estadística; a este nivel no necesitamos agregar ninguna
configuración especial para las escrituras transaccionales.

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

## Adición de datos a una estadística

Siguiendo con nuestro ejemplo, vamos a agregar datos a la estadística definida anteriormente. La diferencia clave
entre una solicitud normal y esta es el parámetro especial `TransactionId`. Este parámetro sirve como
identificador de la solicitud que se está ejecutando. Cada vez que llega una nueva solicitud, el sistema compara los nuevos
identificadores de transacción con los identificadores que ya se procesaron. Si se encuentra una coincidencia, la solicitud no se va a ejecutar.

Un aspecto clave a tener en cuenta es que este comportamiento transaccional establece una relación entre el
`TransactionId` y la solicitud que se está ejecutando, no con las estadísticas individuales dentro de esa solicitud.
No hay una asignación para cada estadística individual; la asignación es para toda la solicitud. Además, cuando se usa esta característica,
tenemos un medidor diferente para realizar el seguimiento de este tipo de solicitudes; obtenga más información aquí: [Medidores de estadísticas](/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);
}
```

Ahora, expliquemos algunos elementos clave de este ejemplo:

* `Entity`: Este parámetro corresponde a la entidad desde la que queremos realizar la actualización de la estadística.
* `TransactionId`: Este parámetro corresponde a una cadena que representa un identificador único de la solicitud.
* `Statistics`: Este parámetro corresponde al conjunto real de estadísticas de una entidad.
* `StatisticUpdate`: Este parámetro corresponde a los valores de estadísticas que se van a agregar.
  * `Scores`: Este parámetro corresponde a la lista de puntuaciones que puede agregar a una entidad. Recuerde que las estadísticas pueden tener más de una columna.
    Puede consultar estos conceptos en profundidad aquí: [Más operaciones con estadísticas](/services/playfab/player-progression/statistics/doing-more-statistics)
  * `Name`: Este parámetro corresponde al nombre de la estadística establecido al crear la definición de estadística.

Con estos conceptos claros, ya está listo para agregar datos a su estadística y evitar cualquier duplicación en sus solicitudes.

## Consulte también

* [Creación de estadísticas básicas](/services/playfab/player-progression/statistics/create-basic-statistics).
* [Más operaciones con estadísticas](/services/playfab/player-progression/statistics/doing-more-statistics).
* [Estadísticas de temporada](/services/playfab/player-progression/statistics/seasonal-statistics).
* [Adición de datos contextuales a las estadísticas](/services/playfab/player-progression/statistics/metadata-statistics).
* [Referencia de API](/services/playfab/player-progression/statistics/api-reference).
* [Límites](/services/playfab/player-progression/statistics/limits-statistics).
* [Cuota](/services/playfab/player-progression/statistics/quota-statistics)
* [Medidores de estadísticas](/services/playfab/pricing/meters/statistics-meters).


## Related topics

- [Medidores de estadísticas](/es/services/playfab/pricing/meters/statistics-meters.md)
- [Transacciones idempotentes y patrones de reintento en Economy v2](/es/services/playfab/economy-monetization/economy-v2/tutorials/idempotent-transactions-and-retries.md)
- [Historial de transacciones](/es/services/playfab/economy-monetization/economy-v2/inventory/transaction-history.md)
- [Descripción de las API del medidor de escrituras de inventario](/es/services/playfab/pricing/meters/economy-writes.md)
- [Descripción de las API del medidor de escrituras de perfil](/es/services/playfab/pricing/meters/profile-writes.md)
