使用 DynamoDB 的版本号进行乐观锁定,使用Amazon SDK for .NET对象持久化模型 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 DynamoDB 的版本号进行乐观锁定,使用Amazon SDK for .NET对象持久化模型

对象持久化模型中的乐观锁定支持可确保应用程序的项目版本与服务器端的项目版本相同,然后再更新或删除项目。假设您检索要更新的项目。但是,在您发送更新之前,其他一些应用程序会更新相同的项目。现在,您的应用程序有该项目的过时副本。如果没有乐观锁定,您执行的任何更新都将覆盖其他应用程序所做的更新。

对象持久化模型的乐观锁定功能提供了DynamoDBVersion标签,您可以使用它来启用乐观锁定。要使用此功能,请向类添加一个属性以存储版本号。您可以添加DynamoDBVersion属性添加到属性。首次保存对象时,DynamoDBContext会分配一个版本号,并在每次更新项目时递增此值。

只有在客户端对象版本与服务器端对应的项目版本号相匹配时,您的更新或删除请求才能成功。如果您的应用程序有过时的副本,则必须从服务器获取最新版本,然后才能更新或删除该项目。

下面的 C# 代码示例定义了Book类,其中包含对象持久性属性将其映射到ProductCatalog表。这些区域有:VersionNumber属性在类中装饰着DynamoDBVersion属性存储版本号值。

[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?)。

乐观锁具有以下影响DynamoDBContext操作:

  • 对于新项目,DynamoDBContext分配初始版本号 0。如果您检索现有项目,然后更新它的一个或多个属性,并尝试保存所做更改,那么只有在客户端和服务器端的版本号匹配时保存操作才能成功。DynamoDBContext会递增版本号。您无需设置版本号。

  • 这些区域有:Delete方法提供的重载可以接收主键值或对象作为参数的重载,如以下 C# 代码示例所示。

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