All Products
Search
Document Center

Tablestore:Gunakan pembaruan bersyarat

Last Updated:Aug 06, 2026

Tablestore SDK untuk Java hanya menulis, memperbarui, atau menghapus baris jika baris target memenuhi kondisi yang ditentukan.

Prasyarat

Instal Tablestore SDK untuk Java dan inisialisasi klien.

Deskripsi

Kontainer Condition mencakup kondisi keberadaan baris (rowExistenceExpectation), kondisi kolom (columnCondition), atau keduanya. Teruskan kondisi yang telah dikonfigurasi ke metode setCondition() pada objek RowPutChange, RowUpdateChange, atau RowDeleteChange. Perubahan baris tersebut juga dapat dimasukkan dalam permintaan BatchWriteRow. Jika kondisi tidak terpenuhi, server akan mengembalikan error dan baris tetap tidak berubah.

rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)

Contoh berikut memperbarui baris dengan kunci primer row1 di tabel condition_demo hanya jika baris tersebut ada. Jika tidak, server akan mengembalikan error.

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

Parameter

Kondisi pembaruan

Condition mencakup parameter berikut. Kondisi keberadaan baris dan kondisi kolom dapat digunakan secara terpisah atau bersamaan. Tidak ada kondisi yang dievaluasi ketika rowExistenceExpectation bernilai IGNORE dan columnCondition tidak diatur.

Nama

Tipe

Deskripsi

rowExistenceExpectation (opsional)

RowExistenceExpectation

Kondisi keberadaan baris. Nilai yang valid:

  • IGNORE (default): Melewati pemeriksaan keberadaan baris.

  • EXPECT_EXIST: Cocok jika baris target ada di tabel.

  • EXPECT_NOT_EXIST: Cocok jika baris target tidak ada di tabel.

columnCondition (opsional)

ColumnCondition

Kondisi kolom. Subkelasnya adalah SingleColumnValueCondition untuk pemeriksaan satu kolom dan CompositeColumnValueCondition untuk pemeriksaan gabungan.

Kondisi nilai kolom tunggal

Ketika Condition.columnCondition berupa SingleColumnValueCondition, parameter berikut tersedia.

Nama

Type

Deskripsi

columnName (wajib)

String

Nama kolom atribut yang akan diperiksa.

operator (wajib)

CompareOperator

Operator perbandingan. Nilai yang valid:

  • EQUAL

  • NOT_EQUAL

  • GREATER_THAN

  • GREATER_EQUAL

  • LESS_THAN

  • LESS_EQUAL

columnValue (wajib)

ColumnValue

Nilai yang akan dibandingkan.

passIfMissing (opsional)

boolean

Menentukan apakah baris dianggap memenuhi kondisi jika kolom atribut target tidak ada. Default: true (kolom yang tidak ada dianggap memenuhi kondisi).

Atur ke false agar kolom yang tidak ada dianggap tidak memenuhi kondisi.

latestVersionsOnly (opsional)

boolean

Menentukan apakah hanya versi data terbaru yang diperiksa. Default: true.

Atur ke false agar kondisi terpenuhi jika versi mana pun memenuhi syarat.

Kondisi komposit

Ketika Condition.columnCondition berupa CompositeColumnValueCondition, parameter berikut tersedia. Tambahkan subkondisi menggunakan metode addCondition(). Anda dapat menambahkan hingga 32 subkondisi.

Nama

Type

Deskripsi

type (wajib)

LogicOperator

Operator logika. Nilai yang valid:

  • AND. Tambahkan minimal dua subkondisi.

  • OR. Tambahkan minimal dua subkondisi.

  • NOT. Tambahkan tepat satu subkondisi.

conditions (wajib)

List<ColumnCondition>

Subkondisi untuk operasi logika. Tambahkan setiap subkondisi dengan addCondition(). Subkondisi dapat berupa SingleColumnValueCondition atau CompositeColumnValueCondition lain — gunakan bentuk komposit untuk menyarangkan kondisi.

Contoh

Kondisi nilai kolom tunggal

Gunakan SingleColumnValueCondition untuk memeriksa nilai satu kolom atribut. Contoh berikut memperbarui col2 pada baris dengan kunci primer row1 hanya jika col1 == "changed_val1".

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

Kondisi nilai kolom komposit

Gunakan CompositeColumnValueCondition untuk menggabungkan beberapa kondisi dengan operator logika. Anda dapat menyarangkan kondisi komposit satu sama lain. Contoh berikut membangun kondisi (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"));

// Sub-kondisi: 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")));

// Kondisi OR tingkat atas: (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));

Cegah penimpaan konkuren

Terapkan compare-and-swap dengan pembaruan bersyarat: pertama baca nilai saat ini, lalu gunakan nilai tersebut sebagai kondisi pembaruan. Pembaruan berhasil hanya jika kolom masih memiliki nilai yang Anda baca. Jika proses lain memodifikasi kolom antara pembacaan dan penulisan Anda, pembaruan akan gagal. Hal ini mencegah Anda menimpa hasil tulisan proses tersebut.

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

// 1. Baca nilai saat ini.
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. Lakukan pembaruan bersyarat berdasarkan nilai yang baru saja dibaca (hanya perbarui jika col1 masih sama dengan 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));