Bloqueio positivo usando número de versão com o DynamoDB usando o modelo de persistência de objetos do AWS SDK for .NET
O suporte para bloqueio otimista no modelo de persistência de objetos garante que a versão do item para a sua aplicação seja igual à versão do item no lado do servidor antes que esse item seja atualizado ou excluído. Suponha que você recupere um item para atualização. No entanto, antes de você retornar suas atualizações, outra aplicação atualiza o mesmo item. Agora, a aplicação tem uma cópia obsoleta do item. Sem o bloqueio otimista, qualquer atualização que você realizar substituirá a atualização feita pelo outro aplicativo.
O recurso de bloqueio otimista do modelo de persistência de objetos fornece a tag DynamoDBVersion
que você pode usar para habilitar o bloqueio otimista. Para usar esse recurso, adicione uma propriedade à sua classe para armazenar o número de versão. Você adiciona o atributo DynamoDBVersion
à propriedade. Quando o objeto for salvo pela primeira vez, DynamoDBContext
atribuirá um número de versão e incrementará esse valor cada vez que você atualizar o item.
Sua solicitação de atualização ou exclusão só será bem-sucedida se a versão do objeto no lado do cliente corresponder ao número de versão correspondente do item no lado do servidor. Se a sua aplicação tiver uma cópia obsoleta, ela deverá obter a versão mais recente do servidor antes de poder atualizar ou excluir o item.
O exemplo de código C# a seguir define uma classe Book
com atributos de persistência de objetos mapeando-a na tabela ProductCatalog
. A propriedade VersionNumber
na classe decorada com o atributo DynamoDBVersion
armazena o valor do número de versão.
exemplo
[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
Você pode aplicar o atributo DynamoDBVersion
apenas a um tipo primitivo numérico anulável (como int?
).
O bloqueio otimista tem o seguinte impacto sobre operações DynamoDBContext
:
-
Para um novo item,
DynamoDBContext
atribui o número de versão inicial 0. Se você recuperar um item existente, atualizar uma ou mais das suas propriedades e tentar salvar as alterações, a operação de salvamento será bem-sucedida somente se o número de versão no lado do cliente e no lado do servidor corresponderem.DynamoDBContext
incrementa o número de versão. Você não precisa definir o número de versão. -
O método
Delete
fornece sobrecargas que podem usar um valor de chave primária ou um objeto como parâmetro, conforme mostrado no exemplo de código C# a seguir.exemplo
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);
Se você fornecer um objeto como parâmetro, a exclusão apenas será bem-sucedida se a versão do objeto corresponder à versão de item no lado do servidor correspondente. No entanto, se você fornecer um valor de chave primária como parâmetro,
DynamoDBContext
desconhecerá qualquer número de versão e excluirá o item sem fazer a verificação de versão.Observe que a implementação interna do bloqueio otimista no código do modelo de persistência de objetos usa as ações de API de atualização condicional e exclusão condicional no DynamoDB.
Desabilitar o bloqueio positivo
Para desabilitar o bloqueio otimista, use a propriedade de configuração SkipVersionCheck
. Você pode definir essa propriedade ao criar DynamoDBContext
. Nesse caso, o bloqueio otimista está desabilitado para solicitações feitas usando o contexto. Para ter mais informações, consulte Especificar parâmetros opcionais para DynamoDBContext .
Em vez de definir a propriedade no nível do contexto, você pode desabilitar o bloqueio otimista para uma operação específica, conforme mostrado no exemplo de código C# a seguir. O exemplo de código usa o contexto para excluir um item de livro. O método Delete
define a propriedade SkipVersionCheck
opcional como true, desabilitando a verificação de versão.
exemplo
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 });