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à.
DynamoDB e blocco ottimistico con numero di versione
Il blocco ottimistico è una strategia che assicura che l'elemento lato client che si sta aggiornando (o eliminando) sia lo stesso elemento in Amazon DynamoDB. Se utilizzi questa strategia le scritture del tuo database sono protette da eventuali sovrascritture da parte di altre scritture di terzi e viceversa.
Con il blocco ottimistico, ogni voce dispone di un attributo che funge da numero di versione. Se recuperi un item da una tabella, l'applicazione registra il numero di versione di tale item. Puoi aggiornare l'item, ma solo se il numero di versione lato server non è cambiato. In caso di mancata corrispondenza delle versioni, qualcun altro ha modificato l'item prima dell'utente. Il tentativo di aggiornamento non riesce, perché si dispone di una versione obsoleta dell'item. In tal caso, riprova recuperando l'elemento e quindi provando ad aggiornarlo. Il blocco ottimistico evita di sovrascrivere accidentalmente le modifiche che sono state apportate da altri. Impedisce anche ad altri di sovrascrivere accidentalmente le modifiche.
Sebbene tu possa implementare la tua strategia di blocco ottimistica, fornisce l' AWS SDK for Java annotazione. @DynamoDBVersionAttribute
Nella classe di mappatura della tabella, puoi indicare una proprietà nella quale memorizzare il numero di versione e contrassegnarlo utilizzando questa annotazione. Quando si salva un oggetto, l'elemento corrispondente nella tabella DynamoDB conterrà un attributo che memorizza il numero di versione. DynamoDBMapper
assegna un numero di versione quando salvi l'oggetto per la prima volta e incrementa automaticamente il numero di versione ogni volta che aggiorni l'item. Le richieste di aggiornamento o eliminazione avranno esito positivo solo se la versione dell'oggetto lato client corrisponde al numero di versione dell'elemento corrispondente nella tabella DynamoDB.
ConditionalCheckFailedException
viene generato se:
-
utilizzi il blocco ottimistico con
@DynamoDBVersionAttribute
e il valore della versione del server è diverso dal valore sul lato client; -
specifichi le tue limitazioni condizionali quando salvi i dati utilizzando
DynamoDBMapper
conDynamoDBSaveExpression
e tali limitazioni non sono riuscite.
Nota
-
Le tabelle globali DynamoDB utilizzano una riconciliazione di tipo "last writer wins" per aggiornamenti contestuali. Se utilizzi le tabelle globali, vince la policy "last writer". Pertanto in questo caso la strategia di blocco non funziona come previsto.
-
Le operazioni di scrittura transazionali
DynamoDBMapper
non supportano l'annotazione e le espressioni di condizione@DynamoDBVersionAttribute
all'interno dello stesso oggetto. Se un oggetto all'interno di una scrittura transazionale viene annotato con@DynamoDBVersionAttribute
e ha anche un'espressione condizionale, verrà generata una. SdkClientException
Ad esempio, nel seguente codice Java si definisce una classe CatalogItem
che possiede diverse proprietà. La proprietà Version
viene etichettata con l'annotazione @DynamoDBVersionAttribute
.
Esempio
@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { private Integer id; private String title; private String ISBN; private Set<String> bookAuthors; private String someProp; private Long version; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id; } public void setId(Integer Id) { this.id = Id; } @DynamoDBAttribute(attributeName="Title") public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @DynamoDBAttribute(attributeName="ISBN") public String getISBN() { return ISBN; } public void setISBN(String ISBN) { this.ISBN = ISBN;} @DynamoDBAttribute(attributeName = "Authors") public Set<String> getBookAuthors() { return bookAuthors; } public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; } @DynamoDBIgnore public String getSomeProp() { return someProp;} public void setSomeProp(String someProp) {this.someProp = someProp;} @DynamoDBVersionAttribute public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version;} }
Puoi applicare l'annotazione @DynamoDBVersionAttribute
ai tipi nullable disponibili nelle classi wrapper primitive che forniscono un tipo nullable, come Long
e Integer
.
Il blocco ottimistico ha il seguente impatto su questi metodi DynamoDBMapper
:
-
save
: per un nuovo elemento, ilDynamoDBMapper
assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione di salvataggio ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono.DynamoDBMapper
incrementa il numero di versione in modo automatico. -
delete
: il metododelete
utilizza un oggetto come parametro eDynamoDBMapper
esegue un controllo della versione prima di eliminare l'elemento. La verifica della versione può essere disabilitata se nella richiesta viene specificatoDynamoDBMapperConfig.SaveBehavior.CLOBBER
.L'implementazione interna del blocco ottimistico in
DynamoDBMapper
utilizza il supporto degli aggiornamenti e delle eliminazioni condizionali fornite da DynamoDB. -
transactionWrite
—-
Put
: per un nuovo elemento, ilDynamoDBMapper
assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione put ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono.DynamoDBMapper
incrementa il numero di versione in modo automatico. -
Update
: per un nuovo elemento, ilDynamoDBMapper
assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione update ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono.DynamoDBMapper
incrementa il numero di versione in modo automatico. -
Delete
:DynamoDBMapper
esegue un controllo della versione prima di eliminare l'elemento. L'operazione delete riesce solo se il numero di versione sul lato client e sul lato server corrispondono. -
ConditionCheck
: l'annotazione@DynamoDBVersionAttribute
non è supportata per le operazioniConditionCheck
. SdkClientException Verrà generato un elemento quando unConditionCheck
elemento viene annotato con.@DynamoDBVersionAttribute
-
Disabilitazione del blocco ottimistico
Per disabilitare il blocco ottimistico, puoi modificare il valore di enumerazione DynamoDBMapperConfig.SaveBehavior
da UPDATE
in CLOBBER
. Puoi farlo creando un'istanza DynamoDBMapperConfig
che non esegua la verifica della versione e utilizzi tale istanza per tutte le richieste. Per informazioni sui parametri DynamoDBMapperConfig.SaveBehavior
e altri parametri opzionali DynamoDBMapper
, consulta Impostazioni di configurazione opzionali per D ynamoDBMapper .
Inoltre puoi impostare il comportamento di blocco per una sola operazione specifica. Ad esempio, nel seguente frammento di codice Java si utilizza DynamoDBMapper
per salvare un item del catalogo. Specifica DynamoDBMapperConfig.SaveBehavior
aggiungendo il parametro opzionale DynamoDBMapperConfig
al metodo save
.
Nota
Il transactionWrite metodo non supporta D ynamoDBMapper Config. SaveBehaviorconfigurazione. La disabilitazione del blocco ottimistico per non transactionWrite è supportata.
Esempio
DynamoDBMapper mapper = new DynamoDBMapper(client); // Load a catalog item. CatalogItem item = mapper.load(CatalogItem.class, 101); item.setTitle("This is a new title for the item"); ... // Save the item. mapper.save(item, new DynamoDBMapperConfig( DynamoDBMapperConfig.SaveBehavior.CLOBBER));