

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 資產模型寫入的樂觀鎖定


 更新資產模型時，使用者會執行下列動作：

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)

## 使用樂觀鎖定執行資產模型寫入 （主控台）


以下程序說明如何在主控台中對資產模型的作用中版本執行具有樂觀鎖定的資產模型寫入。

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

1. <a name="sitewise-choose-models"></a>在導覽窗格中，選擇 **Models (模型)**。

1. 選擇要更新的資產模型或元件模型。

1. 選擇**編輯**。

1. 在**編輯模型**頁面上進行變更。

1. 選擇**儲存**。
**注意**  
有時候，當使用者開始編輯模型，並將所做的編輯儲存至模型時，就會發生一或多個成功的模型更新。  
為了確保使用者不會意外覆寫新的成功更新，會拒絕使用者的寫入。主控台會停用**儲存**按鈕，並提示使用者重新整理**編輯模型**頁面。使用者必須再次更新模型的新作用中版本。使用者必須執行下列額外步驟：

1. 選擇 **Refresh (重新整理)**。

1. 再次遵循步驟 5 和 6。

## 使用樂觀鎖定執行資產模型寫入 (AWS CLI)


以下程序說明如何在 中執行具有樂觀鎖定的資產模型寫入 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. **使用寫入條件執行 UPDATE 和 DELETE 操作**

   下列資產模型 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`。