Tüm Ürünler
Search
Belge Merkezi

Tablestore:Use conditional updates

Son Güncelleme:Oct 02, 2026

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:

  • IGNORE (varsayılan): Satır varlık denetimini atlar.

  • EXPECT_EXIST: Hedef satır tabloda mevcut ise eşleşir.

  • EXPECT_NOT_EXIST: Hedef satır tabloda mevcut değilse eşleşir.

columnCondition (optional)

ColumnCondition

Sütun koşulu. Alt sınıflar, tek sütunlu denetimler için SingleColumnValueCondition ve birleştirilmiş denetimler için CompositeColumnValueCondition şeklindedir.

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:

  • EQUAL

  • NOT_EQUAL

  • GREATER_THAN

  • GREATER_EQUAL

  • LESS_THAN

  • LESS_EQUAL

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: true (eksik sütun, koşulu karşılıyor olarak değerlendirilir).

Eksik bir sütunun koşulu karşılamadığını belirtmek için false olarak ayarlayın.

latestVersionsOnly (optional)

boolean

Yalnızca en son veri sürümünün denetlenip denetlenmeyeceği. Varsayılan: true.

Herhangi bir sürümün koşulu karşılaması durumunda eşleşme sağlamak için false olarak ayarlayın.

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:

  • AND. En az iki alt koşul ekleyin.

  • OR. En az iki alt koşul ekleyin.

  • NOT. Tam olarak bir alt koşul ekleyin.

conditions (required)

List<ColumnCondition>

Mantıksal işlem için alt koşullar. Her alt koşulu addCondition() ile ekleyin. Bir alt koşul ya bir SingleColumnValueCondition ya da başka bir CompositeColumnValueCondition olabilir; koşulları iç içe yerleştirmek için bileşik formu kullanın.

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