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 all-or-nothing un approccio 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, poiché le modifiche concomitanti 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 diverse.
La tua logica aziendale richiede la all-or-nothing semantica: o tutte le modifiche hanno esito positivo o nessuna viene applicata.
Gli esempi più comuni includono il trasferimento di fondi tra conti, l'effettuazione di ordini che aggiornano sia l'inventario che le tabelle degli ordini e lo scambio di articoli tra giocatori durante una partita.
Compromessi
- Costo di scrittura più elevato
Per articoli fino a 1 KB, le transazioni consumano 2 unità WCUs per articolo (una per la preparazione e l'altra per il completamento), 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 ha esito negativo. In scenari ad alta tensione, ciò può portare a cancellazioni frequenti.
Implementazione
L'esempio seguente utilizza TransactWriteItems il trasferimento atomico dell'inventario tra due articoli. 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 condition 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 di commit. Questo è ciò che fornisce il pessimistico controllo della concorrenza: le modifiche concomitanti in conflitto sono impedite dalla transazione stessa.
Nota
È possibile combinare le transazioni con il blocco ottimistico aggiungendo 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.