Bloqueo positivo mediante DynamoDB y el modelo de persistencia de objetos de AWS SDK for .NET - Amazon DynamoDB

Bloqueo positivo mediante DynamoDB y el modelo de persistencia de objetos de AWS SDK for .NET

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

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

    ejemplo
    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

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 .

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

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