本文介紹如何在 Java SDK 中使用條件更新,設定更新條件後,只有目標行資料滿足指定的條件,才能完成更新。
前提條件
功能說明
條件更新的類聲明如下:
public class Condition {
private RowExistenceExpectation rowExistenceExpectation;
private ColumnCondition columnCondition;
// method declaration
}範例程式碼
以下範例程式碼以 updateRow 方法為例介紹如何設定條件更新。
public static void setConditionExample(SyncClient client) {
// 構造更新資料
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
// 構造更新條件
Condition condition = new Condition();
// 目標行資料在資料表中存在時才進行資料更新
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);
// 構造 Request,調用 updateRow 方法更新資料
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);
// 返回結果處理
System.out.println("* RequestId: " + updateRowResponse.getRequestId());
System.out.println("* Read CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("* Write CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
}設定列值判斷條件,判斷單個屬性列的值是否滿足條件。
// col1 列的值等於 val1 時才進行資料更新 SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1")); condition.setColumnCondition(singleColumnValueCondition);設定列值判斷條件,對多個條件進行判斷。
// 設定組合條件 1 CompositeColumnValueCondition compositeColumnValueCondition1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND); // 添加子條件 SingleColumnValueCondition singleColumnValueCondition1 = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1")); compositeColumnValueCondition1.addCondition(singleColumnValueCondition1); SingleColumnValueCondition singleColumnValueCondition2 = new SingleColumnValueCondition("col2", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val2")); compositeColumnValueCondition1.addCondition(singleColumnValueCondition2); // 設定組合條件 2 CompositeColumnValueCondition compositeColumnValueCondition2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR); // 添加子條件 compositeColumnValueCondition2.addCondition(compositeColumnValueCondition1); SingleColumnValueCondition singleColumnValueCondition3 = new SingleColumnValueCondition("col3", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val3")); compositeColumnValueCondition2.addCondition(singleColumnValueCondition3); // 添加組合條件,判斷條件為 (col1 = val1 and col2 = val2) or (col3 = val3) condition.setColumnCondition(compositeColumnValueCondition2);
情境案例
以下範例程式碼使用條件更新功能類比樂觀鎖的 CAS 實現。
public static void OptimisticLocking(SyncClient client) {
// 構造主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// 讀取原屬性列的值
SingleRowQueryCriteria singleRowQueryCriteria = new SingleRowQueryCriteria("test_condition", primaryKey);
singleRowQueryCriteria.setMaxVersions(1);
GetRowRequest getRowRequest = new GetRowRequest(singleRowQueryCriteria);
GetRowResponse getRowResponse = client.getRow(getRowRequest);
String oldValue = getRowResponse.getRow().getLatestColumn("col1").getValue().asString();
// 更新資料
RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
// 設定更新條件,目標屬性列最新版本的值等於預期值(讀取到的值)時,才進行更新
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString(oldValue));
singleColumnValueCondition.setPassIfMissing(false);
singleColumnValueCondition.setLatestVersionsOnly(true);
condition.setColumnCondition(singleColumnValueCondition);
rowUpdateChange.setCondition(condition);
// 構造 Request,調用 updateRow 方法更新資料
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);
// 返回結果處理
System.out.println("* RequestId: " + updateRowResponse.getRequestId());
System.out.println("* Read CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("* Write CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
}