Topik ini menjelaskan cara menggunakan fitur pembaruan bersyarat di Tablestore SDK untuk Java. Baris target hanya diperbarui jika kondisi yang ditentukan terpenuhi.
Prasyarat
Deskripsi
Kelas Condition dideklarasikan sebagai berikut:
public class Condition {
private RowExistenceExpectation rowExistenceExpectation;
private ColumnCondition columnCondition;
// Deklarasi metode
}Contoh kode
Contoh kode berikut menunjukkan cara melakukan pembaruan bersyarat menggunakan metode updateRow.
public static void setConditionExample(SyncClient client) {
// Konstruksi data pembaruan.
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"));
// Konstruksi kondisi pembaruan.
Condition condition = new Condition();
// Perbarui data hanya jika baris target ada di tabel data.
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);
// Konstruksi permintaan dan panggil metode updateRow untuk memperbarui data.
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);
// Proses respons.
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());
}Tetapkan kondisi nilai kolom untuk memeriksa apakah nilai dari satu kolom atribut memenuhi kondisi tertentu.
// Perbarui data hanya jika nilai kolom col1 adalah val1. SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1")); condition.setColumnCondition(singleColumnValueCondition);Tetapkan kondisi nilai kolom untuk memeriksa beberapa sub-kondisi.
// Tetapkan kondisi komposit 1. CompositeColumnValueCondition compositeColumnValueCondition1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND); // Tambahkan sub-kondisi. 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); // Tetapkan kondisi komposit 2. CompositeColumnValueCondition compositeColumnValueCondition2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR); // Tambahkan sub-kondisi. compositeColumnValueCondition2.addCondition(compositeColumnValueCondition1); SingleColumnValueCondition singleColumnValueCondition3 = new SingleColumnValueCondition("col3", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val3")); compositeColumnValueCondition2.addCondition(singleColumnValueCondition3); // Tambahkan kondisi komposit. Kondisi adalah (col1 = val1 and col2 = val2) or (col3 = val3). condition.setColumnCondition(compositeColumnValueCondition2);
Casus penggunaan
Contoh kode berikut menunjukkan cara menggunakan fitur pembaruan bersyarat untuk mensimulasikan operasi compare-and-swap (CAS) untuk kunci optimis.
public static void OptimisticLocking(SyncClient client) {
// Konstruksi kunci utama.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Baca nilai asli dari kolom atribut.
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();
// Perbarui data.
RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
// Tetapkan kondisi pembaruan. Pembaruan dilakukan hanya jika versi terbaru dari kolom atribut target sama dengan nilai yang diharapkan (nilai yang dibaca).
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);
// Konstruksi permintaan dan panggil metode updateRow untuk memperbarui data.
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);
// Proses respons.
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());
}