全部产品
Search
文档中心

Tablestore:Pembaruan bersyarat

更新时间:Aug 19, 2025

Topik ini menjelaskan cara menggunakan fitur pembaruan bersyarat di Tablestore SDK untuk Java. Baris target hanya diperbarui jika kondisi yang ditentukan terpenuhi.

Prasyarat

Inisialisasi klien

Deskripsi

Kelas Condition dideklarasikan sebagai berikut:

public class Condition {
    private RowExistenceExpectation rowExistenceExpectation;
    private ColumnCondition columnCondition;
    
    // Deklarasi metode
}

Properti

  • rowExistenceExpectation (opsional): Kondisi keberadaan baris. Tiga jenis tersedia:

    • IGNORE (default): Tidak memeriksa apakah baris ada.

    • EXPECT_EXIST: Kondisi terpenuhi jika baris target ada di tabel data.

    • EXPECT_NOT_EXIST: Kondisi terpenuhi jika baris target tidak ada di tabel data.

  • columnCondition (opsional): Kondisi nilai kolom. Dua jenis tersedia:

    • SingleColumnValueCondition: Memeriksa apakah nilai dari satu kolom atribut memenuhi kondisi tertentu. Parameter dijelaskan dalam tabel berikut.

      Parameter

      Tipe

      Deskripsi

      operator (wajib)

      CompareOperator

      Operator relasional. Nilai valid: EQUAL, NOT_EQUAL, GREATER_THAN, GREATER_EQUAL, LESS_THAN, dan LESS_EQUAL.

      columnName (wajib)

      String

      Nama kolom atribut yang akan diperiksa.

      columnValue (wajib)

      ColumnValue

      Nilai yang akan diperiksa.

      passIfMissing (opsional)

      Boolean

      Menentukan apakah kondisi terpenuhi jika baris tidak mengandung kolom atribut target. Nilai default: true. Jika baris tidak mengandung kolom tersebut, kondisi terpenuhi.

      latestVersionsOnly (opsional)

      Boolean

      Menentukan apakah hanya memeriksa versi data terbaru. Nilai default: true. Jika kolom atribut target memiliki beberapa versi, hanya nilai versi terbaru yang diperiksa.

    • CompositeColumnValueCondition: Memeriksa apakah data baris memenuhi kondisi komposit tertentu. Parameter dijelaskan dalam tabel berikut.

      Parameter

      Tipe

      Deskripsi

      type (wajib)

      LogicOperator

      Operator logika. Nilai valid: NOT, AND, dan OR.

      conditions (wajib)

      List<ColumnCondition>

      Daftar sub-kondisi untuk operasi logika.

      • Sub-kondisi dapat berupa SingleColumnValueCondition atau CompositeColumnValueCondition.

      • Anda dapat menggabungkan hingga 32 kondisi.

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());
}