

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
<a name="BestPractices_PessimisticLocking"></a>

Le transazioni [DynamoDB](transactions.md) forniscono all-or-nothing un approccio alle operazioni raggruppate. Quando si utilizza`TransactWriteItems`, 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
<a name="BestPractices_PessimisticLocking_WhenToUse"></a>

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
<a name="BestPractices_PessimisticLocking_Tradeoffs"></a>

**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
<a name="BestPractices_PessimisticLocking_Implementation"></a>

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](transactions.md).