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 :
-
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'] -
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 -
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.