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:
|
|
columnCondition (opsional) |
ColumnCondition |
Kondisi kolom. Subkelasnya adalah |
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:
|
|
columnValue (wajib) |
ColumnValue |
Nilai yang akan dibandingkan. |
|
passIfMissing (opsional) |
boolean |
Menentukan apakah baris dianggap memenuhi kondisi jika kolom atribut target tidak ada. Default: Atur ke |
|
latestVersionsOnly (opsional) |
boolean |
Menentukan apakah hanya versi data terbaru yang diperiksa. Default: Atur ke |
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:
|
|
conditions (wajib) |
List<ColumnCondition> |
Subkondisi untuk operasi logika. Tambahkan setiap subkondisi dengan |
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));