條件更新__Java-SDK (NEW)_SDK 參考_表格存儲-阿裏雲
條件更新功能是指隻有在滿足條件時才對表中的數據進行更改,當不滿足條件時更新失敗,可用於 PutRow、UpdateRow、DeleteRow 和 BatchWriteRow 中。
判斷條件包括行存在性條件和列條件。
行存在性條件:分為 IGNORE、 EXPECT_EXIST 和 EXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。在對表進行更改操作時,會首先檢查行存在性條件。若不滿足,則更改失敗,對用戶拋錯。
列條件:目前支持兩種,SingleColumnValueCondition 和 CompositeColumnValueCondition。是基於某一列或者某些列的列值進行條件判斷,與過濾器 Filter 中的條件非常類似。
基於條件更新可以實現樂觀鎖的功能,即在更新某行時,先獲取某列的值。假設為列 A,值為 1,然後設置條件“列 A=1”,更新該行同時使“列 A=2”。若更新失敗,代表有其他客戶端已經成功更新了該行。
示例 1
構造 SingleColumnValueCondition。
// 設置條件為Col0==0.
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// 如果不存在Col0這一列, 條件檢查不通過.
singleColumnValueCondition.setPassIfMissing(false);
// 隻判斷最新版本
singleColumnValueCondition.setLatestVersionsOnly(true);
示例 2
構造 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);
### 示例 3
通過 Condition 實現樂觀鎖機製, 遞增一列。
```java
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());
}
}
最後更新:2016-11-23 16:04:16
上一篇:
多行數據操作__Java-SDK_SDK 參考_表格存儲-阿裏雲
下一篇:
過濾器(Filter)__Java-SDK (NEW)_SDK 參考_表格存儲-阿裏雲
阿裏雲網站服務條款(Aliyun Website Service Agreement)__賬號注冊_會員帳號及密碼_會員賬號&實名認證-阿裏雲
網絡類型說明與使用場景__常見問題_專有網絡 VPC-阿裏雲
查詢可用地域列表__地域相關接口_API 參考_雲服務器 ECS-阿裏雲
添加已有雲服務器__集群管理_用戶指南_容器服務-阿裏雲
服務條款__產品簡介_消息服務-阿裏雲
BandwidthPackagePublicIpMonitorDataSetType__數據類型_API參考_專有網絡 VPC-阿裏雲
接入後HTTPS異常(SNI問題)__排錯手冊_Web 應用防火牆-阿裏雲
雲服務器 ECS 肉雞類問題排查思路
504錯誤___排錯手冊_Web 應用防火牆-阿裏雲
雲服務器 ECS 安全組 應用案例
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲