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
Instância OTSClient inicializada. Para mais informações, consulte Inicializar uma instância OTSClient.
Tabela de dados criada com dados gravados. Para mais informações, consulte Criar tabelas de dados e Gravar dados.
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.
|
|
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.
|
|
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);
}