条件付き更新機能は、指定された条件が満たされた場合にのみテーブルデータを更新します。 条件が満たされない場合、更新は失敗します。 条件付き更新は、PutRow、UpdateRow、DeleteRow および BatchWriteRow に適用できます。

判定条件には、行の存在条件と列ベースの条件があります。

  • 行存在条件: この条件は IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST の3種類に分けられます。 テーブルを更新する必要がある場合、システムは最初に行の存在状態を確認します。 行の存在条件が満たされていないと、更新は失敗し、システムはエラーをスローします。

  • 列ベースの条件: この条件は現在 SingleColumnValueCondition と CompositeColumnValueCondition をサポートしています。 これらは、Table Store フィルタで使用される条件と同様に、1 つ以上の列の値に基づいて条件ベースの判断を下すために使用されます。

条件付き更新を使用して楽観的ロックを実装できます。 行を更新する必要がある場合、システムは最初に列の値を取得します。 たとえば、列 A の値が 1 であるとします。 "Column A = 1" という条件を設定し、行を更新し、 "Column 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 を使用できます。 次の例は、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();

            // 1行読み込みます。
            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());
            }
        }