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
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 che verifica se il numero di versione corrisponde al valore letto l'ultima volta dall'applicazione. Se nel frattempo un altro processo ha modificato l'elemento, la condizione fallisce e DynamoDB restituisce un. ConditionalCheckFailedException
Quando usare il blocco ottimistico
Il blocco ottimistico è adatto quando:
Più utenti o processi possono aggiornare lo stesso elemento, ma i conflitti sono rari.
Ritentare una scrittura non riuscita è poco costoso per l'applicazione.
Volete evitare il sovraccarico e la complessità della gestione dei blocchi distribuiti.
Esempi comuni includono gli aggiornamenti dell'inventario dell'e-commerce, le piattaforme di modifica collaborativa e i record delle transazioni finanziarie.
Compromessi
- Riprova a spese generali in caso di forte contenzioso
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 di versione agli elementi e la gestione dei controlli condizionali aggiungono complessità alla logica dell'applicazione. L' AWS SDK for Java v2 Enhanced Client fornisce supporto integrato tramite l'
@DynamoDbVersionAttributeannotazione, che gestisce automaticamente i numeri di versione per te.
Progettazione dei modelli
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
Per implementare il blocco ottimistico, segui questi passaggi:
-
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'] -
Aggiorna l'elemento utilizzando un'espressione condizionale che controlli 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 -
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 fornisce un supporto integrato per il blocco ottimistico tramite l'@DynamoDbVersionAttributeannotazione, che gestisce automaticamente i numeri di versione.
Per ulteriori informazioni sulle espressioni di condizione, vedere. Esempio di CLI di espressione condizionale in DynamoDB