

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.

# DynamoDB et verrouillage optimiste avec numéro de version
<a name="DynamoDBMapper.OptimisticLocking"></a>

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. Si cela se produit, essayez à nouveau en récupérant l’élément, puis en tentant 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 pour Java elle fournit l'`@DynamoDBVersionAttribute`annotation. 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`.

**Example**  

```
@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
<a name="DynamoDBMapper.OptimisticLocking.Disabling"></a>

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 Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md). 

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 méthode TransactionWrite ne prend pas en charge Dynamo Config. DBMapper SaveBehaviorconfiguration. La désactivation du verrouillage optimiste pour transactionWrite n’est pas prise en charge.

**Example**  

```
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));
```