Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK for .NET - 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à.

Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK for .NET

Il supporto ottimistico del blocco nel modello di persistenza degli oggetti garantisce che la versione dell'elemento per l'applicazione corrisponda alla versione dell'elemento sul lato server prima di aggiornare o eliminare l'elemento. Si supponga di recuperare un elemento per l'aggiornamento. Tuttavia, prima di inviare nuovamente gli aggiornamenti, alcune altre applicazioni aggiornano lo stesso elemento. In questa situazione, la tua applicazione avrà una copia obsoleta dell'elemento. Senza il blocco ottimistico, qualsiasi aggiornamento eseguito sovrascriverà l'aggiornamento effettuato dall'altra applicazione.

La funzione di blocco ottimistica del modello di persistenza degli oggetti fornisce il tag DynamoDBVersion che è possibile utilizzare per abilitare il blocco ottimistico. Per utilizzare questa funzionalità, è necessario aggiungere una proprietà alla classe per memorizzare il numero di versione. Quindi aggiungere l'attributo DynamoDBVersion alla proprietà. Quando si salva l'oggetto per la prima volta, DynamoDBContext assegna un numero di versione che viene incrementato automaticamente ogni volta che si aggiorna l'elemento.

Le richieste di aggiornamento ed eliminazione hanno esito positivo solo se la versione dell'oggetto lato client corrisponde al numero di versione dell'elemento corrispondente del lato server. Se l'applicazione dispone di una copia non aggiornata, deve ottenere la versione più recente dal server prima di poter aggiornare o eliminare tale elemento.

L'esempio di codice C# seguente definisce una classe Book con attributi di persistenza dell'oggetto che la mappano alla tabella ProductCatalog. La proprietà VersionNumber nella classe lavorata con l'attributo DynamoDBVersion memorizza il valore del numero di versione.

Esempio
[DynamoDBTable("ProductCatalog")] public class Book { [DynamoDBHashKey] //Partition key public int Id { get; set; } [DynamoDBProperty] public string Title { get; set; } [DynamoDBProperty] public string ISBN { get; set; } [DynamoDBProperty("Authors")] public List<string> BookAuthors { get; set; } [DynamoDBVersion] public int? VersionNumber { get; set; } }
Nota

Puoi applicare l'attributo DynamoDBVersion solo a un tipo primitivo numerico annullabile (come int?).

Il blocco ottimistico ha il seguente impatto sulle operazioni DynamoDBContext:

  • Per un nuovo elemento, DynamoDBContext assegna il numero di versione iniziale uguale a 0. Se si recupera un elemento esistente, si aggiorna una o più delle sue proprietà e si prova a salvare le modifiche, l'operazione di salvataggio ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono. DynamoDBContext incrementa quindi il numero di versione. Non è necessario impostare il numero di versione.

  • Il metodo Delete fornisce overload che possono assumere il valore di una chiave primaria o un oggetto come parametro, come mostrato nel seguente esempio di codice C#.

    Esempio
    DynamoDBContext context = new DynamoDBContext(client); ... // Load a book. Book book = context.Load<ProductCatalog>(111); // Do other operations. // Delete 1 - Pass in the book object. context.Delete<ProductCatalog>(book); // Delete 2 - Pass in the Id (primary key) context.Delete<ProductCatalog>(222);

    Se si specifica un oggetto come parametro, l'eliminazione ha esito positivo solo se la versione dell'oggetto corrisponde alla versione dell'elemento lato server corrispondente. Tuttavia, se si specifica un valore di chiave primaria come parametro, DynamoDBContext non è a conoscenza di alcun numero di versione ed elimina l'elemento senza effettuare il controllo della versione.

    Tenere presente che l'implementazione interna del blocco ottimistico nel codice del modello di persistenza degli oggetti utilizza l'aggiornamento condizionale e le operazioni API di eliminazione condizionale in DynamoDB.

Disabilitazione del blocco ottimistico

Per disabilitare il blocco ottimistico, utilizza la proprietà di configurazione SkipVersionCheck. È possibile impostare questa proprietà durante la creazione di DynamoDBContext. In questo caso, il blocco ottimistico è disabilitato per qualsiasi richiesta effettuata utilizzando il contesto. Per ulteriori informazioni, consulta Specificazione dei parametri opzionali per Dynamo DBContext .

Invece di impostare la proprietà a livello di contesto, è possibile disattivare il blocco ottimistico per un'operazione specifica, come mostrato nel seguente esempio di codice C#. Nell'esempio viene utilizzato il contesto per eliminare un elemento del libro. Il metodo Delete imposta la proprietà SkipVersionCheck facoltativa su true, disabilitando il controllo della versione.

Esempio
DynamoDBContext context = new DynamoDBContext(client); // Load a book. Book book = context.Load<ProductCatalog>(111); ... // Delete the book. context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });