Todos os produtos
Search
Central de documentação

Tablestore:Executar atualizações condicionais

Última atualização: Jul 03, 2026

O recurso de atualização condicional permite atualizar dados em uma tabela de dados apenas se as condições especificadas forem atendidas. Caso contrário, a atualização falha.

Pré-requisitos

Observações de uso

Ao chamar as operações PutRow, UpdateRow, DeleteRow ou BatchWriteRow para atualizar dados em uma tabela de dados, especifique condições de existência de linha e condições baseadas em colunas para executar atualizações condicionais. O Tablestore atualiza os dados na tabela de dados apenas se as condições forem atendidas.

É possível executar atualizações condicionais com base em condições de existência de linha e condições baseadas em colunas.

  • Condições de existência de linha compatíveis: IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST.

    Ao atualizar uma tabela de dados, o Tablestore verifica primeiro se as condições de existência de linha são atendidas. Se não forem, a atualização falha e um erro é retornado.

  • As condições baseadas em colunas incluem RelationalCondition e CompositeCondition, usadas para determinar se as condições são atendidas com base nos valores de uma ou mais colunas.

    Essas condições aceitam os seguintes operadores relacionais: =, !=, >, >=, < e <=. Também há suporte aos operadores lógicos NOT, AND e OR. Você pode especificar até 10 condições baseadas em colunas para uma atualização condicional.

    • RelationalCondition compara uma coluna com uma constante. Não há suporte para comparação entre duas colunas ou entre duas constantes.

    • CompositeCondition consiste em múltiplas RelationalConditions ou CompositeConditions. Defina as relações lógicas entre as subcondições.

Use atualizações condicionais para implementar bloqueio otimista. Ao atualizar uma linha, obtenha o valor de uma coluna específica e especifique uma condição de atualização de linha baseada nesse valor. Por exemplo, ao atualizar o valor da Coluna A em uma linha para 2, obtenha o valor da Coluna A. Neste exemplo, o valor obtido é 1. Em seguida, especifique que a linha só pode ser atualizada se o valor da Coluna A for 1. Se a condição especificada for atendida, a atualização será bem-sucedida. Se outro cliente atualizar a linha, a atualização falhará.

Parâmetros

Parâmetro

Descrição

RowExistenceExpectation

Ao atualizar uma tabela de dados, o Tablestore verifica primeiro se as condições de existência de linha são atendidas. Se não forem, a atualização falha e um erro é retornado.

Condições de existência de linha compatíveis: IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST.

  • IGNORE: Ignora a existência da linha. Nenhuma verificação de existência é executada.

  • EXPECT_EXIST: Espera-se que a linha exista. A condição é atendida se a linha existir.

  • EXPECT_NOT_EXIST: Espera-se que a linha não exista. A condição é atendida se a linha não existir.

ColumnName

Nome da coluna.

ColumnValue

Valor a ser comparado com a coluna.

Operator

Operador relacional usado para comparar valores. Para mais informações, consulte ComparatorType.

Operadores relacionais compatíveis: =, !=, >, >=, < e <=.

LogicOperator

Operador lógico usado para combinar múltiplas condições. Para mais informações, consulte LogicalOperator.

Operadores lógicos compatíveis: NOT, AND e OR.

O número de subcondições necessárias varia conforme o operador lógico.

  • Se o operador lógico for NOT, adicione apenas uma subcondição.

  • Se o operador lógico for AND ou OR, adicione pelo menos duas subcondições.

PassIfMissing

Especifica se a verificação condicional é aprovada quando uma coluna não existe em uma linha. Este parâmetro é do tipo Boolean. O valor padrão é true, o que indica que, se a coluna não existir na linha, a verificação condicional é aprovada e a linha atende às condições de atualização.

Se PassIfMissing for definido como false, a verificação condicional falhará quando a coluna não existir na linha.

LatestVersionsOnly

Especifica se apenas o valor da versão mais recente deve ser usado quando a coluna tiver múltiplas versões de valores. Este parâmetro é do tipo Boolean. O valor padrão é true, o que indica que, se a coluna tiver múltiplas versões de dados, apenas o valor da versão mais recente será usado para comparação.

Se LatestVersionsOnly for definido como false, os valores de todas as versões serão usados para comparação caso a coluna tenha múltiplas versões de dados. Nesse caso, a verificação condicional é aprovada quando uma das versões atender à condição.

Exemplo

O código de exemplo a seguir mostra como atualizar dados com base em condições de coluna. Se o valor da coluna col0 for igual a 5, os dados serão atualizados. Caso contrário, a atualização falhará.

    // Specify the primary key of the row. The primary key must be the same as the primary key that is specified in TableMeta when the table is created. 
    PrimaryKey primaryKey = new PrimaryKey();
    primaryKey.Add("pk0", new ColumnValue(0));
    primaryKey.Add("pk1", new ColumnValue("abc"));

    // Specify the attribute columns of the row. 
    AttributeColumns attribute = new AttributeColumns();
    attribute.Add("col0", new ColumnValue(0));
    attribute.Add("col1", new ColumnValue("a"));
    attribute.Add("col2", new ColumnValue(true));

    PutRowRequest request = new PutRowRequest(tableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);

    // Call the PutRow operation when other conditions are not configured The operation is expected to succeed. 
    try
    {
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    } catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }

    // If the value of the col0 column is not equal to 5, call the PutRow operation again to overwrite the original value. The operation is expected to succeed. 
    try
    {
        request.Condition.ColumnCondition = new RelationalCondition("col0",
                                            CompareOperator.NOT_EQUAL,
                                            new ColumnValue(5));
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    } catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }

    // If the value of the col0 column is equal to 5, call the PutRow operation again to overwrite the original value. The operation is expected to succeed. 
    try
    {
        // Add a new condition that the value of the col0 column is equal to 5. 
        request.Condition.ColumnCondition = new RelationalCondition("col0",
                                            CompareOperator.EQUAL,
                                            new ColumnValue(5));
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    }
    catch (OTSServerException)
    {
        // OTSServerException is returned because the condition is not met. 
        Console.WriteLine("Put row failed  because condition check failed. but expected");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }