閱讀427 返回首頁    go 阿裏雲 go 技術社區[雲棲]


條件更新__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。

  1. // 設置條件為Col0==0.
  2. SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("Col0",
  3. SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  4. // 如果不存在Col0這一列, 條件檢查不通過.
  5. singleColumnValueCondition.setPassIfMissing(false);
  6. // 隻判斷最新版本
  7. singleColumnValueCondition.setLatestVersionsOnly(true);

示例 2

構造 CompositeColumnValueCondition。

  1. // composite1 條件為 (Col0 == 0) AND (Col1 > 100)
  2. CompositeColumnValueCondition composite1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);
  3. SingleColumnValueCondition single1 = new SingleColumnValueCondition("Col0",
  4. SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  5. SingleColumnValueCondition single2 = new SingleColumnValueCondition("Col1",
  6. SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
  7. composite1.addCondition(single1);
  8. composite1.addCondition(single2);
  9. // composite2 條件為 ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10)
  10. CompositeColumnValueCondition composite2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
  11. SingleColumnValueCondition single3 = new SingleColumnValueCondition("Col2",
  12. SingleColumnValueCondition.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
  13. composite2.addCondition(composite1);
  14. composite2.addCondition(single3);
  1. ### 示例 3
  2. 通過 Condition 實現樂觀鎖機製, 遞增一列。
  3. ```java
  4. private static void updateRowWithCondition(SyncClient client, String pkValue) {
  5. // 構造主鍵
  6. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  7. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  8. PrimaryKey primaryKey = primaryKeyBuilder.build();
  9. // 讀一行
  10. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
  11. criteria.setMaxVersions(1);
  12. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  13. Row row = getRowResponse.getRow();
  14. long col0Value = row.getLatestColumn("Col0").getValue().asLong();
  15. // 條件更新Col0這一列, 使列值+1
  16. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
  17. Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
  18. ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
  19. condition.setColumnCondition(columnCondition);
  20. rowUpdateChange.setCondition(condition);
  21. rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));
  22. try {
  23. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  24. } catch (TableStoreException ex) {
  25. System.out.println(ex.toString());
  26. }
  27. }

最後更新:2016-11-23 16:04:16

  上一篇:go 多行數據操作__Java-SDK_SDK 參考_表格存儲-阿裏雲
  下一篇:go 過濾器(Filter)__Java-SDK (NEW)_SDK 參考_表格存儲-阿裏雲