Tablestore SDK for Java, hedef satır belirtilen koşulu karşıladığında satır yazar, günceller veya siler.
Ön koşullar
Tablestore SDK for Java yükleyin ve istemciyi başlatın.
Açıklama
Condition kapsayıcısı bir satır varlık koşulu (rowExistenceExpectation), bir sütun koşulu (columnCondition) veya her ikisini birden barındırır. Yapılandırılan koşulu; RowPutChange, RowUpdateChange veya RowDeleteChange nesnelerindeki setCondition() yöntemine aktarın. Bu satır değişikliklerini ayrıca bir BatchWriteRow isteğine de dahil edebilirsiniz. Koşul karşılanmazsa sunucu hata döndürür ve satır değişmeden kalır.
rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)
Aşağıdaki örnek, yalnızca satır mevcut olduğunda condition_demo tablosundaki row1 birincil anahtarlı satırı günceller. Aksi takdirde sunucu hata döndürür.
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));
Parametreler
Güncelleme koşulu
Condition aşağıdaki parametreleri içerir. Satır varlık koşulu ve sütun koşulunu ayrı ayrı veya birlikte kullanabilirsiniz. rowExistenceExpectation değeri IGNORE olarak ayarlandığında ve columnCondition tanımlanmadığında hiçbir koşul değerlendirilmez.
|
Name |
Type |
Description |
|
rowExistenceExpectation (optional) |
RowExistenceExpectation |
Satır varlık koşulu. Geçerli değerler:
|
|
columnCondition (optional) |
ColumnCondition |
Sütun koşulu. Alt sınıflar, tek sütunlu denetimler için |
Tek sütunlu değer koşulu
Condition.columnCondition bir SingleColumnValueCondition olduğunda aşağıdaki parametreleri içerir.
|
Name |
Type |
Description |
|
columnName (required) |
String |
Denetlenecek nitelik sütununun adı. |
|
operator (required) |
CompareOperator |
Karşılaştırma işleci. Geçerli değerler:
|
|
columnValue (required) |
ColumnValue |
Karşılaştırılacak değer. |
|
passIfMissing (optional) |
boolean |
Hedef nitelik sütunu eksik olduğunda satırın koşulu karşıladığının kabul edilip edilmeyeceği. Varsayılan: Eksik bir sütunun koşulu karşılamadığını belirtmek için |
|
latestVersionsOnly (optional) |
boolean |
Yalnızca en son veri sürümünün denetlenip denetlenmeyeceği. Varsayılan: Herhangi bir sürümün koşulu karşılaması durumunda eşleşme sağlamak için |
Bileşik koşul
Condition.columnCondition bir CompositeColumnValueCondition olduğunda aşağıdaki parametreleri içerir. Alt koşulları addCondition() yöntemiyle ekleyin. En fazla 32 alt koşul ekleyebilirsiniz.
|
Name |
Type |
Description |
|
type (required) |
LogicOperator |
Mantıksal işleç. Geçerli değerler:
|
|
conditions (required) |
List<ColumnCondition> |
Mantıksal işlem için alt koşullar. Her alt koşulu |
Örnekler
Tek sütunlu değer koşulu
Tek bir nitelik sütunu değerini denetlemek için SingleColumnValueCondition kullanın. Aşağıdaki örnek, yalnızca col1 == "changed_val1" olduğunda row1 birincil anahtarlı satır için col2 sütununu günceller.
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));
Bileşik sütun değeri koşulu
Birden çok koşulu mantıksal işleçlerle birleştirmek için CompositeColumnValueCondition kullanın. Bileşik koşulları birbirinin içine yerleştirebilirsiniz. Aşağıdaki örnek (col1 == "changed_val1" AND col2 == "new_val2") OR (col3 == "val3") koşulunu oluşturur.
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-condition: 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")));
// Top-level OR: (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));
Eşzamanlı üzerine yazmaları önleme
Koşullu güncelleme ile compare-and-swap (karşılaştır ve değiştir) uygulayın: Önce geçerli değeri okuyun, ardından bunu güncelleme koşulu olarak iletin. Güncelleme, yalnızca sütun hala okuduğunuz değeri tutuyorsa başarılı olur. Okuma ve yazma işlemleriniz arasında başka bir süreç sütunu değiştirirse güncelleme başarısız olur. Bu sayede diğer sürecin yazdığı verilerin üzerine yanlışlıkla yazmanız önlenir.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
// 1. Read the current value.
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. Perform a conditional update based on the value just read (only update if col1 still equals 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));