本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
资产模型写入的乐观锁定
更新资产模型时,用户会执行以下操作:
阅读当前的资产模型定义。
根据需要更改编辑资产模型定义。
使用新定义更新资产模型。
在有两个用户更新模型的场景中,可能出现以下情况:
用户 A 读取资产模型 X 的定义。
用户 B 读取资产模型 X 的定义并提交更改,修改了 X 的定义。
用户 A 提交并覆盖用户 B 对资产模型 X 所做的更改,而无需验证或合并用户 B 的更改。
乐观锁定是一种用于防止 AWS IoT SiteWise 意外覆盖的机制,如上面的场景。乐观锁定是一种策略,可确保更新或删除的资产模型的当前版本与其中的当前版本相同 AWS IoT SiteWise。这样可以防止资产模型写入被意外更新覆盖。
按照以下步骤使用乐观锁定执行资产模型写入:
使用乐观锁执行资产模型写入(控制台)
以下过程描述了如何在控制台中对资产模型的活动版本进行乐观锁定来执行资产模型写入。
导航到 AWS IoT SiteWise 控制台
。 在导航窗格中,选择 模型。
选择要更新的资产模型或组件模型。
选择编辑。
在编辑模型页面上进行更改。
选择保存。
注意
有时,在用户开始编辑模型和保存对模型所做的编辑之间,会发生一次或多次成功的模型更新。
为确保用户不会意外覆盖新的成功更新,用户的写入将被拒绝。控制台禁用 “保存” 按钮,并提示用户刷新 “编辑模型” 页面。用户必须再次更新模型的新活动版本。用户必须执行以下额外步骤:
选择 Refresh。
再次执行步骤 5 和 6。
使用乐观锁执行资产模型写入 (AWS CLI)
以下过程描述了如何在乐观锁定下执行资产模型写入 AWS CLI。
-
获取与当前模型定义ETag关联的
ETag
是为资产模型的每个新表示形式生成的唯一代币。调DescribeAssetModelAPI用获取当前的资产模型定义,并ETag
从响应中关联起来。在并发更新期间,用户要么执行成功更新(模型处于
ACTIVE
状态),要么执行不成功的更新(模型处于FAILED
状态)。为确保用户不会意外覆盖成功的更新,您必须从资产模型版本中检索资产模型的活动版本并获取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
以免覆盖任何更新。 -
使用写入条件执行UPDATE和DELETE操作
以下资产模型APIs支持乐观锁定:
注意
以下场景
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
-