

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Blocco ottimistico con il numero di versione
<a name="BestPractices_OptimisticLocking"></a>

Il blocco ottimistico è una strategia che rileva i conflitti in fase di scrittura anziché prevenirli. Ogni elemento include un attributo di versione che aumenta con ogni aggiornamento. Quando si aggiorna un elemento, si include un'[espressione di condizione](Expressions.ConditionExpressions.md) che verifica se il numero di versione corrisponde al valore letto per l'ultima volta dall'applicazione. Se nel frattempo un altro processo ha modificato l'elemento, la condizione fallisce e DynamoDB restituisce un. `ConditionalCheckFailedException`

## Quando utilizzare il blocco ottimistico
<a name="BestPractices_OptimisticLocking_WhenToUse"></a>

Il blocco ottimistico è la soluzione ideale quando:
+ È possibile che più utenti o processi aggiornino lo stesso elemento, ma i conflitti sono rari.
+ Riprovare una scrittura non riuscita è poco costoso per l'applicazione.
+ Desiderate evitare il sovraccarico e la complessità della gestione dei blocchi distribuiti.

Gli esempi più comuni includono gli aggiornamenti dell'inventario per l'e-commerce, le piattaforme di modifica collaborativa e i registri delle transazioni finanziarie.

## Compromessi
<a name="BestPractices_OptimisticLocking_Tradeoffs"></a>

**Riprova le spese generali in caso di alta contesa**  
In ambienti caratterizzati da un elevato tasso di simultaneità, aumenta la probabilità che si verifichino conflitti, con conseguenti potenziali ripetizioni dei tentativi e costi di scrittura.

**Complessità dell’implementazione**  
L'aggiunta del controllo della versione agli articoli e la gestione dei controlli condizionali aggiungono complessità alla logica dell'applicazione. L' AWS SDK for Java v2 Enhanced Client fornisce supporto integrato tramite [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE)l'annotazione, che gestisce automaticamente i numeri di versione per te.

## Progettazione dei modelli
<a name="BestPractices_OptimisticLocking_PatternDesign"></a>

Includi un attributo di versione in ogni elemento. Ecco un semplice schema di progettazione:
+ Chiave di partizione: un identificatore univoco per ogni elemento (ad esempio,`ItemId`).
+ Attributi:
  + `ItemId`: l’identificatore univoco per l’elemento.
  + `Version`: un numero intero che rappresenta il numero di versione dell’elemento.
  + `QuantityLeft`: l’inventario rimanente dell’elemento.

Quando un elemento viene creato per la prima volta, l’attributo `Version` è impostato su 1. A ogni aggiornamento, il numero di versione aumenta di 1.


| ItemID (chiave di partizione) | Versione | QuantityLeft | 
| --- | --- | --- | 
| Banane | 1 | 10 | 
| Mele | 1 | 5 | 
| Arance | 1 | 7 | 

## Implementazione
<a name="BestPractices_OptimisticLocking_Implementation"></a>

Per implementare il blocco ottimistico, procedi nel seguente modo:

1. La versione corrente dell’elemento.

   ```
   def get_item(item_id):
       response = table.get_item(Key={'ItemID': item_id})
       return response['Item']
   
   item = get_item('Bananas')
   current_version = item['Version']
   ```

1. Aggiorna l'elemento utilizzando un'espressione di condizione che controlla il numero di versione.

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

1. Gestisci i conflitti riprovando con una nuova lettura.

   Ogni nuovo tentativo richiede una lettura aggiuntiva, quindi limita il numero totale di tentativi.

   ```
   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.")
   ```

Per le applicazioni Java, l' AWS SDK for Java v2 Enhanced Client offre un supporto integrato per il blocco ottimistico tramite [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-extensions.html#ddb-en-client-extensions-VRE)l'annotazione, che gestisce automaticamente i numeri di versione per te.

Per ulteriori informazioni sulle espressioni condizionali, vedere. [Esempio di CLI di espressione condizionale in DynamoDB](Expressions.ConditionExpressions.md)