Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

乐观锁 (使用版本号) 与 DynamoDB (使用适用于 .NET 的 AWS 开发工具包对象持久性模型) 配合使用

对象持久化模型中支持乐观锁,这样就能在更新或删除项目之前,确保应用程序的项目版本与服务器端的项目版本相同。假如您要检索一个项目进行更新,然而,在您发回更新内容之前,某些其他应用程序已经更新了同一个项目,现在,您的应用程序所拥有的是此项目过时的副本。如果不使用乐观锁,您执行的任何更新都将覆盖其他应用程序执行的更新。

对象持久化模型的乐观锁功能提供了一个 DynamoDBVersion 标签,您可以使用此标签启用乐观锁。要使用此功能,您需要为自己的类添加一个属性,以存储版本号。您要对此属性添加 DynamoDBVersion 属性。当您第一次保存该数据元时,DynamoDBContext 会分配一个版本号,以后您每次更新项目时,此值都会递增。

只有在客户端数据元版本与服务器端项目对应的版本号相符时,您的更新或删除请求才能成功。如果您的应用程序所拥有的是过时副本,那么它必须在更新或删除项目之前先从服务器获取最新版本。

以下 C# 代码段定义的 Book 类具有将其映射到 ProductCatalog 表的对象持久性属性。版本号值存储在类 (以 DynamoDBVersion 属性修饰) 中的 VersionNumber 属性中。

Copy
[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; } }

注意

您只能对可为空的数字基元类型 (例如 int?) 应用 DynamoDBVersion 属性。

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

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

  • Delete 方法提供的重载既可接收主键值参数也可以接收数据元参数 (如以下 C# 代码段所示)。

    Copy
    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,从而停用版本检查。

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

本页内容: