Blocco ottimistico con il numero di versione - Amazon DynamoDB

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

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

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 @DynamoDbVersionAttributel'annotazione, 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, 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']
  2. 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
  3. 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 @DynamoDbVersionAttributel'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