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 politique visant à garantir que l'élément côté client que vous mettez à jour (ou supprimez) est identique à l'élément dans Amazon DynamoDB. Si vous utilisez cette stratégie, les écritures de votre base de données ne peuvent pas être remplacées par les écritures d'autres, et vice versa.

Avec le verrouillage optimiste, chaque élément possède un attribut qui agit comme un numéro de version. Si vous récupérez un élément à partir d'une table, l'application enregistre le numéro de version de cet élément. Vous pouvez mettre à jour l'élément, mais uniquement si le numéro de version sur le côté serveur n'a pas changé. Si les versions ne correspondent pas, cela signifie que quelqu'un d'autre a modifié cet élément avant vous. La tentative de mise à jour échoue car vous possédez une version obsolète de l'élément. Dans ce cas, réessayez en récupérant l'élément puis en essayant de le mettre à jour. Le verrouillage optimiste vous empêche de remplacer accidentellement les modifications effectuées par les autres. Il empêche également que vos modifications soient remplacées.

Bien que vous puissiez mettre en œuvre votre propre stratégie de verrouillage optimiste, AWS SDK for Java elle fournit l'@DynamoDBVersionAttributeannotation. Dans la classe de mappage pour votre table, vous indiquez une propriété pour stocker le numéro de version et vous la marquez à l'aide de cette annotation. Lorsque vous enregistrez un objet, l'élément correspondant dans la table DynamoDB aura un attribut qui stocke le numéro de version. Le DynamoDBMapper attribue un numéro de version lors de l'enregistrement initial de l'objet, et il augmente automatiquement le numéro de version chaque fois que vous mettez à jour l'élément. Vos demandes de mise à jour ou de suppression aboutissent uniquement si la version d'objet côté client correspond au numéro de version de l'élément correspondant dans la table DynamoDB.

ConditionalCheckFailedException est émis si :

  • Vous utilisez le verrouillage optimiste avec @DynamoDBVersionAttribute et la valeur de version sur le serveur est différente de la valeur côté client.

  • Vous spécifiez vos propres contraintes conditionnelles tout en enregistrant des données à l'aide de DynamoDBMapper avec DynamoDBSaveExpression et ces contraintes ont échoué.

Note
  • Les tables globales DynamoDB utilisent un rapprochement « last writer wins » (dernière version valide) entre des mises à jour concomitantes. Si vous utilisez des tables globales, la stratégie « last writer wins » (dernière version valide) s'applique. Dans ce cas, la stratégie de verrouillage ne fonctionne pas comme prévu.

  • Les opérations d'écriture transactionnelle DynamoDBMapper ne prennent pas en charge les expressions d'annotation et de condition @DynamoDBVersionAttribute sur le même objet. Si un objet dans une écriture transactionnelle est annoté avec une expression @DynamoDBVersionAttribute conditionnelle et possède également une expression conditionnelle, une SdkClientException sera émise.

Par exemple, le code Java suivant définit une classe CatalogItem qui possède plusieurs propriétés. La propriété Version est balisée avec l'annotation @DynamoDBVersionAttribute.

Exemple
@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { private Integer id; private String title; private String ISBN; private Set<String> bookAuthors; private String someProp; private Long version; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id; } public void setId(Integer Id) { this.id = Id; } @DynamoDBAttribute(attributeName="Title") public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @DynamoDBAttribute(attributeName="ISBN") public String getISBN() { return ISBN; } public void setISBN(String ISBN) { this.ISBN = ISBN;} @DynamoDBAttribute(attributeName = "Authors") public Set<String> getBookAuthors() { return bookAuthors; } public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; } @DynamoDBIgnore public String getSomeProp() { return someProp;} public void setSomeProp(String someProp) {this.someProp = someProp;} @DynamoDBVersionAttribute public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version;} }

Vous pouvez appliquer l'annotation @DynamoDBVersionAttribute aux types Nullable proposés par les classes de wrappers primitifs qui fournissent un type Nullable, par exemple Long et Integer.

Le verrouillage optimiste a l'impact suivant sur ces méthodes DynamoDBMapper :

  • save – Pour un nouvel élément, le DynamoDBMapper attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d'enregistrer les modifications, l'opération de sauvegarde n'aboutit que si les numéros de version côté client et côté serveur correspondent. Le DynamoDBMapper augmente le numéro de version automatiquement.

  • delete – La méthode delete prend un objet en tant que paramètre, et le DynamoDBMapper effectue une vérification de version avant de supprimer l'élément. Le contrôle de version peut être désactivé si DynamoDBMapperConfig.SaveBehavior.CLOBBER est spécifié dans la demande.

    L'implémentation interne de verrouillage optimiste au sein de DynamoDBMapper utilise la prise en charge de suppression et de mise à jour conditionnelles fournies par DynamoDB.

  • transactionWrite

    • Put – Pour un nouvel élément, le DynamoDBMapper attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d'enregistrer les modifications, l'opération « Put » n'aboutit que si les numéros de version côté client et côté serveur correspondent. Le DynamoDBMapper augmente le numéro de version automatiquement.

    • Update – Pour un nouvel élément, le DynamoDBMapper attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d'enregistrer les modifications, l'opération de mise à jour n'aboutit que si les numéros de version côté client et côté serveur correspondent. Le DynamoDBMapper augmente le numéro de version automatiquement.

    • Delete – Le DynamoDBMapper effectue une vérification de version avant de supprimer l'élément. L'opération de suppression n'aboutit que si les numéros de version côté client et côté serveur correspondent.

    • ConditionCheck – L'annotation @DynamoDBVersionAttribute n'est pas prise en charge pour les opérations ConditionCheck. Un SdkClientException sera lancé lorsqu'un ConditionCheck élément est annoté avec@DynamoDBVersionAttribute.

Désactivation du verrouillage optimiste

Pour désactiver le verrouillage optimiste, vous pouvez changer la valeur d'énumération DynamoDBMapperConfig.SaveBehavior de UPDATE à CLOBBER. Vous pouvez le faire en créant une instance DynamoDBMapperConfig qui ignore la vérification de version et utilise cette instance pour toutes vos demandes. Pour plus d'informations sur les paramètres DynamoDBMapperConfig.SaveBehavior et autres paramètres facultatifs DynamoDBMapper, consultez Paramètres de configuration facultatifs pour D ynamoDBMapper .

Vous pouvez également définir le comportement de verrouillage pour une opération spécifique uniquement. Par exemple, l'extrait de Java suivant utilise le DynamoDBMapper pour enregistrer un élément de catalogue. Il spécifie DynamoDBMapperConfig.SaveBehavior en ajoutant le paramètre DynamoDBMapperConfig facultatif à la méthode save.

Note

La transactionWrite méthode ne prend pas en charge D ynamoDBMapper Config. SaveBehaviorconfiguration. La désactivation du verrouillage optimiste pour n' transactionWrite est pas prise en charge.

Exemple
DynamoDBMapper mapper = new DynamoDBMapper(client); // Load a catalog item. CatalogItem item = mapper.load(CatalogItem.class, 101); item.setTitle("This is a new title for the item"); ... // Save the item. mapper.save(item, new DynamoDBMapperConfig( DynamoDBMapperConfig.SaveBehavior.CLOBBER));