

# Bloqueo positivo mediante DynamoDB y el modelo de persistencia de objetos de AWS SDK para .NET
<a name="DynamoDBContext.VersionSupport"></a>

La compatibilidad del modelo de persistencia de objetos con el bloqueo optimista garantiza que la versión del elemento en la aplicación sea la misma que en el lado del servidor antes de actualizar o eliminar el elemento. Supongamos que recupera un elemento para actualizarlo. Sin embargo, antes de que se devuelvan las actualizaciones, otra aplicación actualiza el mismo elemento. Ahora, su aplicación tiene una copia anticuada del elemento. Sin el bloqueo optimista, cualquier actualización que lleve a cabo sobrescribirá la actualización efectuada por la otra aplicación. 

La característica de bloqueo optimista del modelo de persistencia de objetos proporciona la etiqueta `DynamoDBVersion`, que se puede usar para habilitar el bloqueo optimista. Para utilizar esta característica, se agrega una propiedad a la clase para almacenar el número de versión. Agregue el atributo `DynamoDBVersion` a la propiedad. La primera vez que se guarda el objeto, `DynamoDBContext` asigna un número de versión e incrementa este valor cada vez que se actualiza el elemento. 

Su solicitud de actualización o eliminación solamente se llevará a cabo si la versión del objeto en el lado del cliente coincide con el número de versión del elemento correspondiente en el lado del servidor. Si su aplicación contiene una copia anticuada, debe obtener la versión más reciente del servidor para poder actualizar o eliminar el elemento en cuestión.

En el siguiente ejemplo de código C\$1 se define una clase `Book` con atributos de persistencia de objetos que la mapean a la tabla `ProductCatalog`. La propiedad `VersionNumber` de la clase asociada con el atributo `DynamoDBVersion` almacena el valor del número de versión.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]   //Partition key
    public int Id { get; set; }
    [DynamoDBProperty]
    public string Title { get; set; }
    [DynamoDBProperty]
    public string ISBN { get; set; }
    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }
    [DynamoDBVersion]
    public int? VersionNumber { get; set; }
  }
```

**nota**  
Puede aplicar el atributo `DynamoDBVersion` solamente a un tipo numérico primitivo que pueda contener valores null (por ejemplo, `int?`). 

El bloqueo optimista afecta a las operaciones de `DynamoDBContext` como se indica a continuación:
+ Para un elemento nuevo, `DynamoDBContext` asigna el número de versión inicial 0. Si recupera un elemento, actualiza una o varias de sus propiedades e intenta guardar los cambios, la operación de almacenamiento solamente se lleva a cabo si el número de versión del lado del cliente coincide con el número de versión del lado del servidor. `DynamoDBContext` aumenta el número de versión. No es necesario establecer el número de versión.
+ El método `Delete` proporciona sobrecargas que pueden tomar un valor de clave principal o un objeto como parámetro, como se muestra en el siguiente ejemplo de código C\$1.  
**Example**  

  ```
  DynamoDBContext context = new DynamoDBContext(client);
  ...
  // Load a book.
  Book book = context.Load<ProductCatalog>(111);
  // Do other operations.
  // Delete 1 - Pass in the book object.
  context.Delete<ProductCatalog>(book);
  
  // Delete 2 - Pass in the Id (primary key)
  context.Delete<ProductCatalog>(222);
  ```

  Si proporciona un objeto como parámetro, la eliminación solamente se llevará a cabo si la versión del objeto coincide con el número de versión del elemento correspondiente en el lado del servidor. Sin embargo, si proporciona un valor de clave principal como parámetro, `DynamoDBContext` no detectará los números de versión y eliminará el elemento sin comprobar la versión. 

  Tenga en cuenta que la implementación interna del bloqueo optimista en el código del modelo de persistencia de objetos utiliza las acciones de actualización condicional y eliminación condicional del API de DynamoDB.

## Deshabilitación del bloqueo positivo
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

Para deshabilitar el bloqueo optimista, se usa la propiedad de configuración `SkipVersionCheck`. Puede establecer esta propiedad al crear `DynamoDBContext`. En este caso, el bloqueo optimista está deshabilitado para todas las solicitudes que se realicen utilizando el contexto. Para obtener más información, consulte [Especificación de parámetros opcionales para DynamoDBContext](DotNetDynamoDBContext.md#OptionalConfigParams). 

En lugar de establecer la propiedad para todo el contexto, puede deshabilitar el bloqueo optimista para una operación específica, tal y como se muestra en el siguiente ejemplo de código C\$1. En el ejemplo de código se utiliza el contexto para eliminar un elemento de libro. El método `Delete` establece la propiedad `SkipVersionCheck` opcional en true, con lo que deshabilita la comprobación de versiones.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);
// Load a book.
Book book = context.Load<ProductCatalog>(111);
...
// Delete the book.
context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });
```