

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 per .NET
<a name="DynamoDBContext.VersionSupport"></a>

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\$1 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.

**Example**  

```
[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\$1.  
**Example**  

  ```
  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
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

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](DotNetDynamoDBContext.md#OptionalConfigParams). 

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\$1. 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.

**Example**  

```
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 });
```