全部产品
阿里云办公

条件更新

更新时间:2018-03-28 11:31:43

条件更新功能是指只有在满足条件时才对表中的数据进行更改,当不满足条件时更新失败,可用于 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);

示例 3

通过Condition可以实现乐观锁机制,下面例子演示如何通过Condition实现特定列递增功能。

  1. private static void updateRowWithCondition(SyncClient client, String pkValue) {
  2. // 构造主键
  3. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  4. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  5. PrimaryKey primaryKey = primaryKeyBuilder.build();
  6. // 读一行
  7. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
  8. criteria.setMaxVersions(1);
  9. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  10. Row row = getRowResponse.getRow();
  11. long col0Value = row.getLatestColumn("Col0").getValue().asLong();
  12. // 条件更新Col0这一列, 使列值+1
  13. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
  14. Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
  15. ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
  16. condition.setColumnCondition(columnCondition);
  17. rowUpdateChange.setCondition(condition);
  18. rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));
  19. try {
  20. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  21. } catch (TableStoreException ex) {
  22. System.out.println(ex.toString());
  23. }
  24. }
本文导读目录