DynamoDB e blocco ottimistico con numero di versione - Amazon DynamoDB

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 con DynamoDBSaveExpression 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, il DynamoDBMapper 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 metodo delete utilizza un oggetto come parametro e DynamoDBMapper esegue un controllo della versione prima di eliminare l'elemento. La verifica della versione può essere disabilitata se nella richiesta viene specificato DynamoDBMapperConfig.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, il DynamoDBMapper 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, il DynamoDBMapper 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 operazioni ConditionCheck. SdkClientException Verrà generato un elemento quando un ConditionCheck 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));