Tablestore SDK for Java は、ターゲット行が指定された条件を満たす場合にのみ、行の書き込み、更新、または削除を実行します。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
説明
Condition コンテナーは、行の存在条件 (rowExistenceExpectation)、列条件 (columnCondition)、またはその両方を保持します。設定された条件を setCondition() の RowPutChange、RowUpdateChange、または RowDeleteChange に渡します。これらの行の変更は、BatchWriteRow リクエストに含めることもできます。条件が満たされない場合、サーバーはエラーを返し、行は変更されません。
rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)
次の例では、condition_demo テーブルのプライマリキーが row1 である行を行が存在する場合にのみ更新します。 それ以外の場合、サーバーはエラーを返します。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
パラメーター
更新条件
Condition には、次のパラメーターが含まれています。行の存在条件と列条件は、個別に使用することも、組み合わせて使用することもできます。rowExistenceExpectation が IGNORE で、columnCondition が設定されていない場合、条件は評価されません。
|
名前 |
タイプ |
説明 |
|
|
|
行の存在条件。有効な値は次のとおりです。
|
|
|
|
列条件です。サブクラスには、単一列チェック用の |
単一列の値の条件
Condition.columnCondition が SingleColumnValueCondition である場合、以下のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
|
|
チェックする属性列の名前。 |
|
|
|
比較演算子。有効な値は次のとおりです。
|
|
|
|
比較する値。 |
|
|
|
対象の属性列が存在しない場合に、その行が条件を満たすとみなすかどうか。デフォルト: 欠落した列を条件を満たさないものとして扱うには、 |
|
|
|
最新のデータバージョンのみを確認するかどうか。デフォルト: いずれかのバージョンが条件を満たす場合に一致させるには、 |
複合条件
Condition.columnCondition が CompositeColumnValueCondition の場合、以下のパラメーターが含まれます。addCondition() でサブ条件を追加します。サブ条件は最大 32 個まで追加できます。
|
名前 |
タイプ |
説明 |
|
|
|
論理演算子。有効な値は次のとおりです。
|
|
|
|
論理演算のサブ条件です。各サブ条件は |
例
単一列の値の条件
SingleColumnValueCondition を使用して、単一の属性列の値をチェックします。 次の例では、col1 == "changed_val1" の場合にのみ、プライマリキーが row1 の行の col2 を更新します。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col2", ColumnValue.fromString("new_val2"));
Condition condition = new Condition();
SingleColumnValueCondition singleCondition = new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("changed_val1"));
condition.setColumnCondition(singleCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
複合列の値の条件
CompositeColumnValueCondition を使用して、論理演算子で複数の条件を組み合わせます。 複合条件は入れ子にすることができます。 次の例では、(col1 == "changed_val1" AND col2 == "new_val2") OR (col3 == "val3") という条件を構築します。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("final_val1"));
// サブ条件: col1 == "changed_val1" AND col2 == "new_val2"
CompositeColumnValueCondition andCondition = new CompositeColumnValueCondition(
CompositeColumnValueCondition.LogicOperator.AND);
andCondition.addCondition(new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("changed_val1")));
andCondition.addCondition(new SingleColumnValueCondition(
"col2",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("new_val2")));
// トップレベルの OR: (col1 AND col2) OR (col3)
CompositeColumnValueCondition orCondition = new CompositeColumnValueCondition(
CompositeColumnValueCondition.LogicOperator.OR);
orCondition.addCondition(andCondition);
orCondition.addCondition(new SingleColumnValueCondition(
"col3",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("val3")));
Condition condition = new Condition();
condition.setColumnCondition(orCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
同時上書きの防止
条件付き更新を使用して Compare-and-Swap を実装します:まず現在の値を読み取り、それを更新条件として渡します。更新は、列が読み取った値と依然として同じである場合にのみ成功します。読み取りと書き込みの間に別のプロセスが列を変更した場合、更新は失敗します。これにより、そのプロセスの書き込みを上書きしてしまうことを防ぎます。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
// 1. 現在の値を読み取ります。
SingleRowQueryCriteria queryCriteria = new SingleRowQueryCriteria("condition_demo", primaryKey);
queryCriteria.setMaxVersions(1);
GetRowResponse getResponse = client.getRow(new GetRowRequest(queryCriteria));
String oldValue = getResponse.getRow().getLatestColumn("col1").getValue().asString();
// 2. 読み取った値に基づいて条件付き更新を実行します (col1 がまだ oldValue と等しい場合にのみ更新) 。
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("cas_updated"));
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
SingleColumnValueCondition casCondition = new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString(oldValue));
casCondition.setPassIfMissing(false);
casCondition.setLatestVersionsOnly(true);
condition.setColumnCondition(casCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));