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 pessimistico con transazioni DynamoDB
Le transazioni DynamoDB forniscono un approccio tutto o niente alle operazioni raggruppate. Quando si utilizzaTransactWriteItems, DynamoDB monitora tutti gli elementi della transazione. Se un elemento viene modificato da un'altra operazione durante la transazione, l'intera transazione viene annullata e DynamoDB restituisce un. TransactionCanceledException Questo comportamento fornisce una forma di controllo pessimistico della concorrenza perché le modifiche concorrenti in conflitto vengono prevenute anziché rilevate a posteriori.
Quando utilizzare le transazioni per il blocco
Le transazioni sono adatte quando:
È necessario aggiornare più elementi in modo atomico, all'interno della stessa tabella o tra tabelle.
La tua logica aziendale richiede una semantica «tutto o niente»: o tutte le modifiche vengono eseguite correttamente o non viene applicata nessuna.
Esempi comuni includono il trasferimento di fondi tra conti, l'immissione di ordini che aggiornano sia l'inventario che le tabelle degli ordini e lo scambio di articoli tra giocatori in una partita.
Compromessi
- Costo di scrittura più elevato
Per gli elementi fino a 1 KB, le transazioni richiedono 2 WCU per elemento (una per la preparazione e una per il commit), rispetto a 1 WCU per una scrittura standard.
- Limite di articoli
Una singola transazione può includere fino a 100 azioni su una o più tabelle.
- Sensibilità ai conflitti
Se un elemento della transazione viene modificato da un'altra operazione, l'intera transazione fallisce. In scenari ad alto rischio, ciò può portare a frequenti annullamenti.
Implementazione
L'esempio seguente viene utilizzato TransactWriteItems per trasferire l'inventario tra due articoli in modo atomico. Se un altro processo modifica uno degli articoli durante la transazione, l'intera operazione viene annullata.
import boto3 client = boto3.client('dynamodb') def transfer_inventory(source_id, target_id, quantity): try: client.transact_write_items( TransactItems=[ { 'Update': { 'TableName': 'Inventory', 'Key': {'ItemID': {'S': source_id}}, 'UpdateExpression': 'SET QuantityLeft = QuantityLeft - :qty', 'ConditionExpression': 'QuantityLeft >= :qty', 'ExpressionAttributeValues': { ':qty': {'N': str(quantity)} } } }, { 'Update': { 'TableName': 'Inventory', 'Key': {'ItemID': {'S': target_id}}, 'UpdateExpression': 'SET QuantityLeft = QuantityLeft + :qty', 'ExpressionAttributeValues': { ':qty': {'N': str(quantity)} } } } ] ) return True except client.exceptions.TransactionCanceledException as e: print(f"Transaction canceled: {e}") return False
In questo esempio, l'espressione della condizione verifica che esista un inventario sufficiente, ma non è necessario alcun attributo di versione. DynamoDB annulla automaticamente la transazione se un elemento della transazione viene modificato da un'altra operazione tra le fasi di preparazione e commit. Questo è ciò che consente il controllo pessimistico della concorrenza: le modifiche simultanee in conflitto sono impedite dalla transazione stessa.
Nota
È possibile combinare le transazioni con il blocco ottimistico aggiungendo i controlli di versione come espressioni di condizione aggiuntive. Ciò fornisce un ulteriore livello di protezione ma non è necessario affinché la transazione rilevi i conflitti.
Per ulteriori informazioni, consulta Gestione di flussi di lavoro complessi con transazioni DynamoDB.