Todos os produtos
Search
Central de documentação

Tablestore:Atualização condicional

Última atualização: Jun 23, 2026

Este tópico descreve como usar atualizações condicionais no SDK do Tablestore para Java. Ao definir condições de atualização, o sistema atualiza a linha de destino somente se as condições especificadas forem atendidas.

Pré-requisitos

Inicializar um cliente

Descrição

A classe Condition é declarada da seguinte forma:

public class Condition {
    private RowExistenceExpectation rowExistenceExpectation;
    private ColumnCondition columnCondition;
    
    // Method declaration
}

Propriedades

  • rowExistenceExpectation (opcional): a condição de existência de linha. Os três tipos a seguir estão disponíveis.

    • IGNORE (padrão): não verifica se a linha existe.

    • EXPECT_EXIST: a condição é atendida se a linha de destino existir na tabela de dados.

    • EXPECT_NOT_EXIST: a condição é atendida se a linha de destino não existir na tabela de dados.

  • columnCondition (opcional): a condição de valor de coluna. Os dois tipos a seguir estão disponíveis.

    • SingleColumnValueCondition: verifica se o valor de uma única coluna de atributo atende a uma condição especificada. A tabela a seguir descreve os parâmetros.

      Parâmetro

      Tipo

      Descrição

      operator (obrigatório)

      CompareOperator

      O operador relacional. Valores válidos: EQUAL, NOT_EQUAL, GREATER_THAN, GREATER_EQUAL, LESS_THAN e LESS_EQUAL.

      columnName (obrigatório)

      String

      O nome da coluna de atributo a ser verificada.

      columnValue (obrigatório)

      ColumnValue

      O valor a ser comparado.

      passIfMissing (opcional)

      Boolean

      Especifica se a condição é atendida quando uma linha não contém a coluna de atributo de destino. Valor padrão: true. Se a linha não contiver a coluna, a condição é atendida.

      latestVersionsOnly (opcional)

      Boolean

      Especifica se o sistema verifica apenas a versão mais recente dos dados. Valor padrão: true. Se a coluna de atributo de destino tiver várias versões, o sistema verifica apenas o valor da versão mais recente.

    • CompositeColumnValueCondition: verifica se os dados da linha atendem a uma condição composta especificada. A tabela a seguir descreve os parâmetros.

      Parâmetro

      Tipo

      Descrição

      type (obrigatório)

      LogicOperator

      O operador lógico. Valores válidos: NOT, AND e OR.

      conditions (obrigatório)

      List<ColumnCondition>

      Uma lista de subcondições para a operação lógica.

      • Uma subcondição pode ser um SingleColumnValueCondition ou um CompositeColumnValueCondition.

      • É possível combinar até 32 condições.

Código de exemplo

O exemplo de código a seguir mostra como realizar uma atualização condicional usando o método updateRow.

public static void setConditionExample(SyncClient client) {
    // Construct the update data.
    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"));

    // Construct the update condition.
    Condition condition = new Condition();
    // Update the data only if the target row exists in the data table.
    condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
    rowUpdateChange.setCondition(condition);

    // Construct a request and call the updateRow method to update the data.
    UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
    UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);

    // Process the response.
    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());
}
  • Defina uma condição de valor de coluna para verificar se o valor de uma única coluna de atributo atende a uma condição especificada.

    // Update the data only if the value of the col1 column is val1.
    SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
    condition.setColumnCondition(singleColumnValueCondition);
  • Defina uma condição de valor de coluna para verificar várias subcondições.

    // Set composite condition 1.
    CompositeColumnValueCondition compositeColumnValueCondition1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);
    // Add sub-conditions.
    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);
    // Set composite condition 2.
    CompositeColumnValueCondition compositeColumnValueCondition2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
    // Add sub-conditions.
    compositeColumnValueCondition2.addCondition(compositeColumnValueCondition1);
    SingleColumnValueCondition singleColumnValueCondition3 = new SingleColumnValueCondition("col3", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val3"));
    compositeColumnValueCondition2.addCondition(singleColumnValueCondition3);
    // Add the composite condition. The condition is (col1 = val1 and col2 = val2) or (col3 = val3).
    condition.setColumnCondition(compositeColumnValueCondition2);

Caso de uso

O exemplo de código a seguir mostra como usar o recurso de atualização condicional para simular uma operação de comparação e troca (CAS) para bloqueio otimista.

public static void OptimisticLocking(SyncClient client) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // Read the original value of the attribute column.
    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();

    // Update the data.
    RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
    rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
    // Set the update condition. The update is performed only if the latest version of the target attribute column equals the expected value (the read value).
    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);

    // Construct a request and call the updateRow method to update the data.
    UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
    UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);

    // Process the response.
    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());
}