949
阿裏雲
使用條件更新__最佳實踐_表格存儲-阿裏雲
條件更新功能隻有在滿足條件時才對表中的數據進行更改,當不滿足條件時更新失敗。該功能支持算術運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),支持最多 10 個條件的組合,可用於 PutRow、UpdateRow、DeleteRow 和 BatchWriteRow 中。
列判斷條件包括“行存在性條件”和“列條件”:
“行存在性條件”分為 IGNORE、EXPECT_EXIS 和 EXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。在對表進行更改操作時,會首先檢查行存在性條件,若不滿足,則更改失敗,對用戶拋錯。
“列條件”目前支持 SingleColumnValueCondition 和 CompositeColumnValueCondition,是基於某一列或者某些列的列值進行條件判斷,與過濾器 Filter 中的條件非常類似。
基於條件更新可以實現樂觀鎖的功能,即在更新某行時,先獲取某列的值,假設為列 A,值為 1,然後設置條件“列 A=1”,更新該行同時使“列 A=2”。若更新失敗,代表有其他客戶端已經成功更新了該行。
使用說明
構造 SingleColumnValueCondition。
// 設置條件為 Col0==0。
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// 如果不存在 Col0 這一列, 條件檢查不通過。
singleColumnValueCondition.setPassIfMissing(false);
// 隻判斷最新版本。
singleColumnValueCondition.setLatestVersionsOnly(true);
構造 CompositeColumnValueCondition。
// composite1 條件為 (Col0 == 0) AND (Col1 > 100)
CompositeColumnValueCondition composite1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);
SingleColumnValueCondition single1 = new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
SingleColumnValueCondition single2 = new SingleColumnValueCondition("Col1",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
composite1.addCondition(single1);
composite1.addCondition(single2);
// composite2 條件為 ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10)
CompositeColumnValueCondition composite2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
SingleColumnValueCondition single3 = new SingleColumnValueCondition("Col2",
SingleColumnValueCondition.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
composite2.addCondition(composite1);
composite2.addCondition(single3);
通過 Condition 實現樂觀鎖機製, 遞增一列。
private static void updateRowWithCondition(SyncClient client, String pkValue) {
// 構造主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// 讀一行
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
long col0Value = row.getLatestColumn("Col0").getValue().asLong();
// 條件更新 Col0 這一列, 使列值 +1
RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
condition.setColumnCondition(columnCondition);
rowUpdateChange.setCondition(condition);
rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));
try {
client.updateRow(new UpdateRowRequest(rowUpdateChange));
} catch (TableStoreException ex) {
System.out.println(ex.toString());
}
}
使用場景示例
在網頁計數和遊戲這種高並發的應用上,需要保證計數器更新的原子性,即如下操作:
// 取回當前值
old_value = Read();
// 對當前值進行計算,比如加 1 操作
new_value = func(old_value);
// 使用最新值進行更新
Update(new_value);
在高並發的環境下,old_value 可能被其他客戶端更新,若使用 Conditional Update,就可以做到 Update (new_value) if value == old_value。
特別說明
在高並發場景下,使用條件更新後會有一定幾率的失敗,需要一定次數的重試。
費用計算
數據寫入或者更新成功,不影響各個接口的 CU 計算規則,如果條件更新失敗,則會消耗 1 單位寫 CU 和 1 單位讀 CU。
最後更新:2016-11-23 16:04:13
上一篇:
數據操作篇__最佳實踐_表格存儲-阿裏雲
下一篇:
使用過濾器__最佳實踐_表格存儲-阿裏雲
高性能__產品優勢_產品簡介_雲數據庫 RDS 版-阿裏雲
混合雲__使用金融雲產品_金融雲-阿裏雲
nodejs日誌__常見日誌格式_用戶指南_日誌服務-阿裏雲
EipAddressAssociateType__數據類型_API 參考_雲服務器 ECS-阿裏雲
標簽列表__API列表_OpenAPI 1.0_移動推送-阿裏雲
基本問題__常見問題_日誌服務-阿裏雲
GetHistograms__日誌庫相關接口_API-Reference_日誌服務-阿裏雲
怎樣授權一個子用戶管理兩台指定的RDS實例___雲數據庫(RDS)授權問題_授權常見問題_訪問控製-阿裏雲
申請流程__快速入門_雲數據庫 PetaData-阿裏雲
5.3 海量數據導出__第五章 Data Pipeline_使用手冊_分析型數據庫-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲