

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

# 对资产模型写入进行乐观锁定
<a name="opt-locking-for-model"></a>

 更新资产模型时，用户会执行以下操作：

1. 阅读当前的资产模型定义。

1. 根据所需的更改，编辑资产模型定义。

1. 使用新定义更新资产模型。

 在有两个用户更新模型的场景中，可能出现以下情况：
+ 用户 A 读取资产模型 X 的定义。
+ 用户 B 读取资产模型 X 的定义并提交更改，这会修改 X 的定义。
+ 用户 A 提交并覆盖用户 B 对资产模型 X 所作的更改，而没有验证或合并用户 B 的更改。

 乐观锁定是一种用于防止 AWS IoT SiteWise 意外覆盖的机制，如上面的场景。乐观锁是一种策略，可确保正在更新或删除的资产模型的当前版本与其在 AWS IoT SiteWise中的当前版本相同。这样可以防止资产模型写入被意外的更新所覆盖。

按照以下步骤，使用乐观锁执行资产模型写入：

**Topics**
+ [使用乐观锁执行资产模型写入（控制台）](#opt-locking-for-model-console)
+ [使用乐观锁执行资产模型写入（AWS CLI）](#opt-locking-for-model-cli)

## 使用乐观锁执行资产模型写入（控制台）
<a name="opt-locking-for-model-console"></a>

以下过程描述了如何在控制台中对资产模型的活动版本进行乐观锁定，以执行资产模型写入。

1. <a name="sitewise-open-console"></a>导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. <a name="sitewise-choose-models"></a>在导航窗格中，选择**模型**。

1. 选择要更新的资产模型或组件模型。

1. 选择**编辑**。

1. 在**编辑模型**页面上进行更改。

1. 选择**保存**。
**注意**  
有时，在用户开始编辑模型与保存对模型所作的编辑之间，会发生一次或多次成功的模型更新。  
为确保用户不会意外覆盖成功的新更新，用户的写入将被拒绝。控制台禁用**保存**按钮，并会提示用户刷新**编辑模型**页面。用户必须再次更新该模型的新活动版本。用户必须执行以下额外步骤：

1. 选择**刷新**。

1. 再次执行步骤 5 和 6。

## 使用乐观锁执行资产模型写入（AWS CLI）
<a name="opt-locking-for-model-cli"></a>

以下过程描述了如何在 AWS CLI中通过乐观锁执行资产模型写入。

1. **获取与当前模型定义 ETag 关联的**

    `ETag` 是为资产模型的每个新表示形式生成的唯一令牌。调用 [DescribeAssetModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html)API 以获取当前的资产模型定义，并`ETag`从响应中关联起来。

    在并发更新期间，用户更新可能成功（模型处于 `ACTIVE` 状态），也可能不成功（模型处于 `FAILED` 状态）。为确保用户不会意外覆盖成功的更新，您必须从 [资产模型版本](model-active-version.md) 中检索资产模型的活动版本并获取 `ETag` 值。

   运行如下命令：

   ```
   aws iotsitewise describe-asset-model --asset-model-id asset-model-id \
   --asset-model-version ACTIVE
   ```

    该响应会返回以下结构：

   ```
   {
     "assetModelId": "String",
     "assetModelArn": "String",
     "assetModelName": "String",
     ...
     "eTag": "String"
   }
   ```
**注意**  
 您必须检索资产模型的最新版本及其 `ETag`，以免覆盖任何更新。

1. **使用写入条件执行更新和删除操作**

   以下资产模型 APIs 支持乐观锁定：
   + [UpdateAssetModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html)
   + [DeleteAssetModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DeleteAssetModel.html)
   + [CreateAssetModelCompositeModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModelCompositeModel.html)
   + [UpdateAssetModelCompositeModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModelCompositeModel.html)
   + [DeleteAssetModelCompositeModel](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DeleteAssetModelCompositeModel.html)
**注意**  
 以下场景使用 `UpdateAssetModel` API 作为参考。这些条件适用于上面列出的所有操作。

   以下场景描述了不同的写入条件，具体取决于并发控制要求：
   +  为了不覆盖任何成功的更新，请运行以下命令。自上次读取活动版本以来，不得存在新的活动版本。将 `e-tag` 替换为读取活动版本时使用的 API 操作中返回的 `ETag`。

     ```
     aws iotsitewise update-asset-model \
       --asset-model-id asset-model-id \
       --if-match e-tag \
       --match-for-version-type ACTIVE \
       --cli-input-json file://model-payload.json
     ```
   +  当模型创建失败时，由于处于 `FAILED` 状态，所以其活动版本尚不存在。在提交更改之前，仍然可以覆盖当前存在的新活动版本。如果在上次读取期间不存在活动版本，则运行以下命令，以免覆盖新的活动版本。

     ```
     aws iotsitewise update-asset-model \
       --asset-model-id asset-model-id \
       --if-none-match "*" \
       --match-for-version-type ACTIVE \
       --cli-input-json file://model-payload.json
     ```
   +  为避免覆盖任何成功或失败的更新，请运行以下命令。此命令定义了一个写入条件，可确保自上次读取最新版本以来未创建最新版本。将 `e-tag` 替换为读取活动版本时使用的 API 操作中返回的 `ETag`。

     ```
     aws iotsitewise update-asset-model \
       --asset-model-id asset-model-id \
       --if-match eTag \
       --match-for-version-type LATEST \
       --cli-input-json file://model-payload.json
     ```

     如果写入条件的计算结果为 `FALSE`，则写入请求将失败，并显示 `PreconditionFailedException`。