本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資產模型寫入的最佳鎖定
更新資產模型時,使用者會執行下列動作:
閱讀目前的資產模型定義。
編輯具有所需變更的資產模型定義。
使用新定義更新資產模型。
在有兩個使用者更新模型的案例中,可能會發生下列情況:
使用者 A 讀取資產模型 X 定義。
用戶 B 讀取資產模型 X 定義並提交更改,修改 X 的定義。
使用者 A 認可並覆寫使用者 B 對資產模型 X 所做的變更,而不驗證或合併使用者 B 的變更。
樂觀鎖定是一種機制,用 AWS IoT SiteWise 於防止像上述情況那樣的意外覆蓋。樂觀鎖定是一種策略,以確保資產模型的當前版本被更新或刪除,與中的當前版本相同 AWS IoT SiteWise。如此可保護資產模型寫入,避免遭到意外更新覆寫。
請依照下列步驟執行具有最佳鎖定的資產模型寫入:
使用最佳鎖定 (主控台) 執行資產模型寫入
以下程序說明如何在主控台中對資產模型的作用中版本進行最佳鎖定,執行資產模型寫入。
導覽至 AWS IoT SiteWise 主控台
。 在導覽窗格中,選擇 Models (模型)。
選擇要更新的資產模型或元件模型。
選擇編輯。
在 「編輯模型」 頁面上進行變更。
選擇 Save (儲存)。
注意
有時,在使用者開始編輯模型並將所做的編輯儲存到模型之間,會發生一個或多個成功的模型更新。
為了確保使用者不會意外覆寫新的成功更新,使用者的寫入會遭到拒絕。主控台會停用 [儲存] 按鈕,並提示使用者重新整理 [編輯模型] 頁面。使用者必須再次更新模型的新使用中版本。使用者必須執行下列其他步驟:
選擇 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
.
-