Verrouillage optimiste avec numéro de version - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Verrouillage optimiste avec numéro de version

Le verrouillage optimiste est une stratégie qui détecte les conflits au moment de l'écriture plutôt que de les prévenir. Chaque élément inclut un attribut de version qui augmente à chaque mise à jour. Lorsque vous mettez à jour un élément, vous incluez une expression de condition qui vérifie si le numéro de version correspond à la dernière valeur lue par votre application. Si un autre processus a modifié l'élément dans l'intervalle, la condition échoue et DynamoDB renvoie un. ConditionalCheckFailedException

Quand utiliser le verrouillage optimiste

Le verrouillage optimiste convient parfaitement lorsque :

  • Plusieurs utilisateurs ou processus peuvent mettre à jour le même élément, mais les conflits sont rares.

  • Réessayer une écriture qui a échoué est peu coûteux pour votre application.

  • Vous souhaitez éviter les frais généraux et la complexité liés à la gestion des verrous distribués.

Les exemples courants incluent les mises à jour de l'inventaire du commerce électronique, les plateformes d'édition collaboratives et les enregistrements de transactions financières.

Compromis

Réessayez de surcharger en cas de forte contention

Dans les environnements à simultanéité élevée, le risque de conflits augmente, ce qui peut entraîner de nouvelles tentatives et des coûts d’écriture plus élevés.

Complexité d’implémentation

L'ajout d'un contrôle de version aux éléments et la gestion des vérifications conditionnelles ajoutent de la complexité à la logique de l'application. Le AWS SDK for Java v2 Enhanced Client fournit un support intégré via @DynamoDbVersionAttributel'annotation, qui gère automatiquement les numéros de version pour vous.

Conception de modèle

Incluez un attribut de version dans chaque élément. Voici un schéma simple :

  • Clé de partition : identifiant unique pour chaque élément (par exemple,ItemId).

  • Attributs :

    • ItemId : identifiant unique de l’élément.

    • Version : nombre entier qui représente le numéro de version de l’élément.

    • QuantityLeft : stock restant de l’article.

Lorsqu’un élément est créé pour la première fois, l’attribut Version est défini sur 1. À chaque mise à jour, le numéro de version augmente de 1.

ItemID (clé de partition) Version QuantityLeft
Bananes 1 10
Pommes 1 5
Oranges 1 7

Mise en œuvre

Pour implémenter le verrouillage optimiste, procédez comme suit :

  1. Lisez la version actuelle de l’élément.

    def get_item(item_id): response = table.get_item(Key={'ItemID': item_id}) return response['Item'] item = get_item('Bananas') current_version = item['Version']
  2. Mettez à jour l'élément à l'aide d'une expression de condition qui vérifie le numéro de version.

    def update_item(item_id, qty_bought, current_version): try: response = table.update_item( Key={'ItemID': item_id}, UpdateExpression="SET QuantityLeft = QuantityLeft - :qty, Version = :new_v", ConditionExpression="Version = :expected_v", ExpressionAttributeValues={ ':qty': qty_bought, ':new_v': current_version + 1, ':expected_v': current_version }, ReturnValues="UPDATED_NEW" ) return response except ClientError as e: if e.response['Error']['Code'] == 'ConditionalCheckFailedException': print("Version conflict: another process updated this item.") raise
  3. Gérez les conflits en réessayant avec une nouvelle lecture.

    Chaque nouvelle tentative nécessite une lecture supplémentaire. Limitez donc le nombre total de tentatives.

    def update_with_retry(item_id, qty_bought, max_retries=3): for attempt in range(max_retries): item = get_item(item_id) try: return update_item(item_id, qty_bought, item['Version']) except ClientError as e: if e.response['Error']['Code'] != 'ConditionalCheckFailedException': raise print(f"Retry {attempt + 1}/{max_retries}") raise Exception("Update failed after maximum retries.")

Pour les applications Java, le AWS SDK for Java v2 Enhanced Client fournit un support de verrouillage optimisé intégré via @DynamoDbVersionAttributel'annotation, qui gère automatiquement les numéros de version pour vous.

Pour plus d'informations sur les expressions de condition, consultezExemple de commande CLI d’expression de condition DynamoDB.