AWS SDK for .NET 객체 지속성 모델을 사용하여 DynamoDB에서 버전 번호를 사용하는 낙관적 잠금 - Amazon DynamoDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for .NET 객체 지속성 모델을 사용하여 DynamoDB에서 버전 번호를 사용하는 낙관적 잠금

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

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

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

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

[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# 코드 예제와 같이 Delete 메서드는 기본 키 값 또는 객체를 파라미터로 사용할 수 있는 오버로드를 제공합니다.

    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 작업 삭제를 사용합니다.

낙관적 잠금 비활성화

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

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

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