

# DynamoDB 및 AWS SDK for .NET 객체 지속성 모델을 사용하여 낙관적 잠금 수행
<a name="DynamoDBContext.VersionSupport"></a>

객체 지속성 모델의 낙관적 잠금 지원을 통해 항목을 업데이트하거나 삭제하기 전에 애플리케이션에 대한 항목 버전과 서버 측 항목 버전이 동일해집니다. 업데이트할 항목을 검색하는 경우 그러나 업데이트를 돌려보내기 전에 다른 애플리케이션이 같은 항목을 업데이트했습니다. 이 경우, 애플리케이션 항목의 오래된 복사본이 남게 됩니다. 낙관적 잠금이 없는 경우, 업데이트를 수행하면 다른 애플리케이션에 의해 생성된 업데이트를 덮어씁니다.

객체 지속성 모델의 낙관적 잠금 기능은 낙관적 잠금을 활성화하는 데 사용할 수 있는 `DynamoDBVersion` 태그를 제공합니다. 이 기능을 사용하려면 버전 번호를 저장하기 위해 클래스에 속성을 추가합니다. 이 속성에 `DynamoDBVersion` 속성을 추가합니다. 처음 객체를 저장할 때 `DynamoDBContext`가 버전 번호를 할당하고, 항목이 업데이트될 때마다 이 값을 증가시킵니다.

업데이트나 삭제 요청은 클라이언트 측 객체 버전이 서버 측의 해당 항목 버전 번호와 일치해야만 성공합니다. 애플리케이션에 오래된 사본이 있는 경우에는 서버에서 최신 버전을 받아야만 항목을 업데이트하거나 삭제할 수 있습니다.

다음 C\$1 코드 예제에서는 객체 지속성 속성으로 `Book` 클래스를 정의하며 해당 클래스를 `ProductCatalog` 테이블로 매핑합니다. `VersionNumber` 속성이 데코레이트된 클래스의`DynamoDBVersion` 속성에는 버전 번호 값이 저장됩니다.

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

**참고**  
`DynamoDBVersion` 속성은 `int?`와 같이 null이 허용된 숫자 기본 유형으로만 적용 가능합니다.

낙관적 잠금 전략은 `DynamoDBContext` 작업에 다음과 같은 영향을 끼칩니다.
+ 새로운 항목이 있을 경우, `DynamoDBContext`는 초기 버전 번호를 0으로 할당합니다. 이후 기존 항목을 검색하고 해당 속성을 하나 이상 업데이트한 후 변경 사항을 저장하려고 해도 클라이언트 측 버전 번호와 서버 측 버전 번호가 일치해야만 저장 작업이 성공합니다. `DynamoDBContext`는 버전 번호를 증가시킵니다. 버전 번호를 설정할 필요는 없습니다.
+ 다음 C\$1 코드 예제와 같이 `Delete` 메서드는 기본 키 값 또는 객체를 파라미터로 사용할 수 있는 오버로드를 제공합니다.  
**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);
  ```

  객체를 파라미터로 제공하는 경우 객체 버전이 서버 측 해당 항목 버전과 일치해야만 삭제가 성공합니다. 그러나 기본 키 값을 파라미터로 제공하는 경우 `DynamoDBContext`는 어떤 버전 번호도 알 수 없으며 버전 확인 없이 항목을 삭제합니다.

  단, 낙관적 잠금을 객체 지속성 모델 코드로 내부 구현할 경우에는 DynamoDB의 조건부 업데이트와 조건부 API 작업 삭제를 사용합니다.

## 낙관적 잠금 비활성화
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

낙관적 잠금을 비활성화하려면 `SkipVersionCheck` 구성 속성을 사용합니다. `DynamoDBContext`를 만들 때 이 속성을 설정할 수 있습니다. 이 경우 컨텍스트를 사용하여 수행하는 모든 요청에 대해 낙관적 잠금이 비활성화됩니다. 자세한 내용은 [DynamoDBContext에 대한 옵션 파라미터 지정](DotNetDynamoDBContext.md#OptionalConfigParams) 섹션을 참조하세요.

속성을 컨텍스트 수준에 설정하는 대신 다음 C\$1 코드 예제와 같이 특정 작업에 대한 낙관적 잠금을 비활성화할 수 있습니다. 이 예제에서는 컨텍스트를 사용하여 책 항목을 삭제합니다. `Delete` 메서드는 선택적 `SkipVersionCheck` 속성을 true로 설정하여 버전 확인을 비활성화합니다.

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