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à.
Transazioni Amazon DynamoDB: come funzionano
Con le transazioni Amazon DynamoDB, puoi raggruppare più azioni e inviarle come singola all-or-nothing TransactWriteItems
operazione. TransactGetItems
Le sezioni seguenti descrivono API le operazioni, la gestione della capacità, le best practice e altri dettagli sull'utilizzo delle operazioni transazionali in DynamoDB.
Argomenti
- TransactWriteItems API
- TransactGetItems API
- Livelli di isolamento per le transazioni DynamoDB
- Gestione dei conflitti nelle transazioni in DynamoDB
- Utilizzo delle transazioni in APIs DynamoDB Accelerator () DAX
- Gestione della capacità per le transazioni
- Best practice per le transazioni
- Utilizzo di tabelle transazionali con tabelle globali APIs
- DynamoDB Transactions e la libreria client delle transazioni AWSLabs
TransactWriteItems API
TransactWriteItems
è un'operazione di scrittura sincrona e idempotente che raggruppa fino a 100 azioni di scrittura in un'unica operazione. all-or-nothing Queste azioni possono indirizzare fino a 100 elementi distinti in una o più tabelle DynamoDB all'interno dello AWS stesso account e nella stessa regione. La dimensione aggregata degli elementi nella transazione non può superare i 4 MB. Le operazioni vengono completate in modo atomico, in maniera tale che abbiano tutte esito positivo oppure abbiano tutte esito negativo.
Nota
-
Un'operazione
TransactWriteItems
differisce da un'operazioneBatchWriteItem
nel fatto che tutte le operazioni che contiene devono essere completate con successo, altrimenti non viene apportata alcuna modifica. Con un'operazioneBatchWriteItem
, è possibile che solo alcune azioni nel batch abbiano esito positivo, contrariamente alle altre. -
Le transazioni non possono essere eseguite utilizzando gli indici.
Non è possibile fare riferimento allo stesso item con diverse operazioni all'interno della stessa transazione. Ad esempio, non è possibile eseguire un'operazione ConditionCheck
e Update
per lo stesso item nella stessa transazione.
È possibile aggiungere uno dei seguenti tipi di operazioni a una transazione:
-
Put
: avvia un'operazionePutItem
per creare un nuovo elemento o sostituire un vecchio elemento con uno nuovo, in base a condizioni o senza specificare alcuna condizione. -
Update
: avvia un'operazioneUpdateItem
per modificare gli attributi di un elemento esistente o aggiungere un nuovo elemento alla tabella se non è già presente. Utilizza questa operazione per aggiungere, eliminare o aggiornare attributi su un item esistente in base a condizioni o senza una condizione. -
Delete
: avvia un'operazioneDeleteItem
per eliminare un singolo elemento in una tabella identificata dalla chiave primaria. -
ConditionCheck
: verifica che un elemento esista o controlla la condizione di attributi specifici dell'elemento.
Una volta completata una transazione, le modifiche apportate all'interno di tale transazione vengono propagate agli indici secondari globali (GSIs), ai flussi e ai backup. Poiché la propagazione non è immediata o istantanea, se una tabella viene ripristinata da backup (RestoreTableFromBackup) o esportata in un punto temporale () durante la propagazione, potrebbe contenere alcune ma non tutte le modifiche apportate durante una transazione recente. ExportTableToPointInTime
Idempotenza
È possibile includere un token client quando si effettua una chiamata TransactWriteItems
per garantire che la richiesta sia idempotente. Rendere le transazioni idempotenti impedisce errori nelle applicazioni se la stessa operazione viene inviata più volte a causa di un timeout della connessione o altri problemi di connettività.
Se la chiamata TransactWriteItems
originale è andata a buon fine, allora le successive chiamate TransactWriteItems
con lo stesso token client hanno esito positivo senza apportare alcuna modifica. Se viene impostato il parametro ReturnConsumedCapacity
, la chiamata TransactWriteItems
iniziale restituisce il numero di unità di capacità in scrittura consumate mentre venivano apportate le modifiche. Le successive chiamate TransactWriteItems
con lo stesso token client restituiscono il numero di unità di capacità in lettura consumate durante la lettura dell'item.
Considerazioni importanti sull'idempotenza
-
Un token client è valido per 10 minuti dopo il termine della richiesta che lo utilizza. Dopo 10 minuti, qualsiasi richiesta che utilizza lo stesso token client viene trattata come una nuova richiesta. Lo stesso token client non deve essere riutilizzato per la stessa richiesta dopo 10 minuti.
-
Se si ripete la richiesta con lo stesso token client all'interno della finestra di idempotenza di 10 minuti, ma vengono modificati altri parametri, DynamoDB restituisce un'eccezione
IdempotentParameterMismatch
.
Gestione degli errori per scrittura
Le transazioni di scrittura non hanno esito positivo nelle seguenti circostanze:
-
Quando una condizione in una delle espressioni di condizione non viene soddisfatta.
-
Quando un errore di convalida della transazione si verifica in quanto un'operazione all'interno della stessa operazione
TransactWriteItems
mira allo stesso item. -
Quando una richiesta
TransactWriteItems
è in conflitto con un'operazioneTransactWriteItems
in corso su uno o più item nella richiestaTransactWriteItems
. In questo caso, la richiesta ha esito negativo con unaTransactionCanceledException
. -
Quando la capacità assegnata è insufficiente per il completamento della transazione.
-
Quando la dimensione di un elemento diventa troppo grande (superiore a 400 KB) o un indice secondario locale (LSI) diventa troppo grande o si verifica un errore di convalida simile a causa delle modifiche apportate dalla transazione.
-
Quando è presente un errore utente, come un formato di dati invalido.
Per ulteriori informazioni sulla gestione dei conflitti con le operazioni TransactWriteItems
, consulta Gestione dei conflitti nelle transazioni in DynamoDB.
TransactGetItems API
TransactGetItems
è un'operazione di lettura sincrona che raggruppa fino a 100 operazioni Get
. Queste azioni possono indirizzare fino a 100 elementi distinti in una o più tabelle DynamoDB all'interno dello stesso account e della AWS stessa regione. La dimensione aggregata degli elementi nella transazione non può superare i 4 MB.
Le operazioni Get
vengono eseguite in modo atomico, in maniera tale che abbiano tutte esito positivo oppure abbiano tutte esito negativo.
-
Get
: avvia un'operazioneGetItem
per recuperare un set di attributi dell'elemento con la chiave primaria specificata. Se non viene trovato un item corrispondente,Get
non restituisce dati.
Gestione degli errori per lettura
Le transazioni di lettura non hanno esito positivo nelle seguenti circostanze:
-
Quando una richiesta
TransactGetItems
è in conflitto con un'operazioneTransactWriteItems
in corso su uno o più item nella richiestaTransactGetItems
. In questo caso, la richiesta ha esito negativo con unaTransactionCanceledException
. -
Quando la capacità assegnata è insufficiente per il completamento della transazione.
-
Quando è presente un errore utente, come un formato di dati invalido.
Per ulteriori informazioni sulla gestione dei conflitti con le operazioni TransactGetItems
, consulta Gestione dei conflitti nelle transazioni in DynamoDB.
Livelli di isolamento per le transazioni DynamoDB
I livelli di isolamento delle operazioni transazionali (TransactWriteItems
o TransactGetItems
) e di altre operazioni sono:
SERIALIZABLE
L'isolamento serializzabile garantisce che i risultati di diverse operazioni simultanee siano le stesse, come se nessuna operazione avesse inizio prima che l'ultima fosse finita.
L'isolamento serializzabile è presente tra i seguenti tipi di operazione:
-
Tra una qualsiasi operazione transazionale e una qualsiasi operazione di scrittura standard (
PutItem
,UpdateItem
oDeleteItem
). -
Tra una qualsiasi operazione transazionale e una qualsiasi operazione di lettura standard (
GetItem
). -
Tra un'operazione
TransactWriteItems
e un'operazioneTransactGetItems
.
Sebbene esista un isolamento serializzabile tra le operazioni transazionali e ogni singola scrittura standard in un'BatchWriteItem
operazione, non esiste un isolamento serializzabile tra la transazione e l'operazione come unità. BatchWriteItem
Allo stesso modo, il livello di isolamento tra un'operazione transazionale e un GetItems
individuale in un'operazione BatchGetItem
è serializzabile. Tuttavia, il livello di isolamento tra la transazione e l'operazione BatchGetItem
come unità è read-committed.
Una singola richiesta GetItem
è serializzabile rispetto a una richiesta TransactWriteItems
in uno dei due modi seguenti, prima o dopo la richiesta TransactWriteItems
. Più richieste GetItem
, rispetto alle chiavi in una richiesta TransactWriteItems
simultanea, possono essere eseguite in qualsiasi ordine, e quindi i risultati sono letti–commessi.
Ad esempio, se le richieste GetItem
per l'elemento A e l'elemento B vengono eseguite contemporaneamente a una richiesta TransactWriteItems
che modifica sia l'elemento A che l'elemento B, esistono quattro possibilità:
-
Entrambe le richieste
GetItem
vengono eseguite prima della richiestaTransactWriteItems
. -
Entrambe le richieste
GetItem
vengono eseguite dopo la richiestaTransactWriteItems
. -
La richiesta
GetItem
per l'elemento A viene eseguita prima della richiestaTransactWriteItems
. Per l'elemento B,GetItem
viene eseguito dopoTransactWriteItems
. -
La richiesta
GetItem
per l'elemento B viene eseguita prima della richiestaTransactWriteItems
. Per l'elemento A,GetItem
viene eseguito dopoTransactWriteItems
.
È necessario utilizzare TransactGetItems
se si preferisce un livello di isolamento serializzabile per più richieste. GetItem
Se viene effettuata una lettura non transazionale su più articoli che facevano parte della stessa richiesta di scrittura della transazione in corso, è possibile che tu sia in grado di leggere il nuovo stato di alcuni articoli e il vecchio stato degli altri elementi. Potrai leggere il nuovo stato di tutti gli elementi che facevano parte della richiesta di scrittura della transazione solo quando riceverai una risposta corretta per la scrittura transazionale.
READ-COMMITTED
L'isolamento Read-committed garantisce che le operazioni di lettura restituiscano sempre valori sottoposti a commit per un elemento: la lettura non presenterà mai una vista dell'elemento che rappresenta uno stato di una scrittura transazionale terminata con un errore. L'isolamento read-committed non impedisce le modifiche dell'item immediatamente dopo l'operazione di lettura.
Il livello di isolamento è read-committed tra una qualsiasi operazione transazionale e una qualsiasi operazione di lettura che coinvolga diverse letture standard (BatchGetItem
, Query
o Scan
). Se una scrittura transazionale aggiorna un elemento durante un'operazione BatchGetItem
, Query
o Scan
, la fase successiva dell'operazione di lettura restituisce il nuovo valore sottoposto a commit, con ConsistentRead)
o eventualmente un valore sottoposto a commit precedente (letture a consistenza finale).
Riepilogo dell'operazione
Per riassumere, la seguente tabella mostra i livelli di isolamento tra un'operazione transazionale (TransactWriteItems
o TransactGetItems
) e altre operazioni.
Operazione | Livello di isolamento |
---|---|
|
Serializzabile |
|
Serializzabile |
|
Serializzabile |
|
Serializzabile |
|
Read-committed* |
|
NOTSerializzabile* |
|
Read-committed |
|
Read-committed |
Altra operazione transazionale |
Serializzabile |
I livelli contrassegnati da un asterisco (*) si applicano all'operazione come un'unità. Tuttavia, le singole operazioni all'interno di tali operazioni hanno un livello di isolamento serializzabile.
Gestione dei conflitti nelle transazioni in DynamoDB
Un conflitto transazionale si può verificare durante richieste simultanee a livello di voci su una singola voce all'interno di una transazione. I conflitti tra transazioni possono verificarsi nei seguenti scenari:
-
Una richiesta
PutItem
,UpdateItem
eDeleteItem
per una voce è in conflitto con una richiestaTransactWriteItems
continua che include la stessa voce. -
Una voce all'interno di una richiesta
TransactWriteItems
è parte di un'altra richiestaTransactWriteItems
continua. -
Una voce all'interno di una richiesta
TransactGetItems
è parte di una richiesta continuaTransactWriteItems
,BatchWriteItem
,PutItem
,UpdateItem
oDeleteItem
.
Nota
-
Quando una richiesta
PutItem
,UpdateItem
oDeleteItem
viene rifiutata, la richiesta dà esito negativo con unTransactionConflictException
. -
Se una richiesta a livello di voce all'interno di
TransactWriteItems
oTransactGetItems
viene rifiutata, la richiesta dà esito negativo conTransactionCanceledException
. Se la richiesta fallisce, AWS SDKs non riprovare.Se si utilizza il AWS SDK for Java, l'eccezione contiene l'elenco di CancellationReasons, ordinato in base all'elenco di elementi nel parametro di
TransactItems
richiesta. Per altre lingue, una rappresentazione della stringa dell'elenco è inclusa nel messaggio di errore dell'eccezione. -
Quando un'operazione
TransactWriteItems
oTransactGetItems
in corso è in conflitto con una richiestaGetItem
simultanea, entrambe le operazione possono avere esito positivo.
La TransactionConflict CloudWatch metrica viene incrementata per ogni richiesta a livello di elemento non riuscita.
Utilizzo delle transazioni in APIs DynamoDB Accelerator () DAX
TransactWriteItems
e TransactGetItems
sono entrambi supportati in DynamoDB Accelerator DAX () con gli stessi livelli di isolamento di DynamoDB.
TransactWriteItems
scrive. DAX DAXpassa una TransactWriteItems
chiamata a DynamoDB e restituisce la risposta. Per popolare la cache dopo la scrittura, DAX chiamate TransactGetItems
in background per ogni elemento dell'TransactWriteItems
operazione, il che consuma unità di capacità di lettura aggiuntive. Per ulteriori informazioni, consulta Gestione della capacità per le transazioni. Questa funzionalità consente di mantenere la logica dell'applicazione semplice e di utilizzarla sia DAX per le operazioni transazionali che per quelle non transazionali.
TransactGetItems
le chiamate vengono passate DAX senza che gli elementi vengano memorizzati nella cache locale. Si tratta dello stesso comportamento di un read-in fortemente coerente. APIs DAX
Gestione della capacità per le transazioni
Non è previsto alcun costo aggiuntivo per abilitare le transazioni per le tabelle DynamoDB. Si paga solo per le letture o le scritture che fanno parte della transazione. DynamoDB esegue due letture o scritture sottostanti per ciascun elemento nella transazione: uno per preparare la transazione uno per eseguire il commit della transazione. Le due operazioni di lettura/scrittura sottostanti sono visibili nelle metriche di Amazon CloudWatch .
Pianifica le letture e le scritture aggiuntive richieste da Transactional APIs quando fornisci capacità alle tue tabelle. Ad esempio, si supponga che l'applicazione esegua una transazione al secondo e che ciascuna transazione scriva nella tabella tre elementi da 500 byte. Ogni articolo richiede due unità di capacità di scrittura (WCUs): una per preparare la transazione e l'altra per confermare la transazione. Pertanto, è necessario assegnarne sei WCUs alla tabella.
Se stavi usando DynamoDB Accelerator DAX () nell'esempio precedente, dovresti utilizzare anche due unità di capacità di lettura RCUs () per ogni elemento della chiamata. TransactWriteItems
Quindi è necessario aggiungere altre sei unità RCUs alla tabella.
Analogamente, se l'applicazione esegue una transazione di lettura al secondo e ogni transazione legge tre elementi da 500 byte della tabella, è necessario fornire sei unità di capacità di lettura (RCUs) alla tabella. La lettura di ogni elemento richiede due elementiRCUs: uno per preparare la transazione e uno per confermare la transazione.
Inoltre, SDK il comportamento predefinito consiste nel ritentare le transazioni in caso di TransactionInProgressException
eccezione. Pianifica le unità di capacità di lettura aggiuntive (RCUs) utilizzate da questi nuovi tentativi. Lo stesso vale qualora si ritentino le transazioni nel proprio codice utilizzandone uno ClientRequestToken
.
Best practice per le transazioni
Durante l'utilizzo delle transazioni DynamoDB, considerare le seguenti best practice suggerite.
-
Abilita il dimensionamento automatico o assicurati di aver effettuato il provisioning di una capacità di throughput sufficiente da eseguire le due operazioni di lettura o scrittura per ogni item della transazione.
-
Se non utilizzi un valore AWS fornitoSDK, includi un
ClientRequestToken
attributo quando effettui unaTransactWriteItems
chiamata per assicurarti che la richiesta sia idempotente. -
Non raggruppare le operazioni in una transazione qualora non sia necessario. Ad esempio, se una singola transazione con 10 operazioni può essere suddivisa in diverse transazioni senza compromettere la correttezza dell'applicazione, si raccomanda di frazionare la transazione. Le transazioni più semplici migliorano il throughput e hanno maggiori probabilità di successo.
-
Diverse transazioni che aggiornano gli stessi item simultaneamente possono causare conflitti che annullano le transazioni. Per minimizzare tali conflitti, si consiglia di utilizzare le seguenti best practice DynamoDB per la modellazione dei dati.
-
Se un set di attributi viene spesso aggiornato tra più item come parte di una transazione singola, considera di raggruppare gli attributi in un singolo item per ridurre l'ambito della transazione.
-
Evita l'uso di transazioni per l'inserimento di dati in blocco. Per le scritture in blocco, è consigliabile utilizzare
BatchWriteItem
.
Utilizzo di tabelle transazionali con tabelle globali APIs
Le operazioni contenute in una transazione DynamoDB sono garantite solo nella regione in cui la transazione è stata originariamente eseguita. La transazionalità non viene preservata quando le modifiche applicate all'interno di una transazione vengono replicate tra regioni in repliche di tabelle globali.
DynamoDB Transactions e la libreria client delle transazioni AWSLabs
Le transazioni DynamoDB forniscono un sostituto più economico, robusto e performante della libreria client delle transazioni. AWSLabs