O recurso de atualização condicional permite atualizar dados em uma tabela 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 Initialize an OTSClient instance.
Tabela de dados criada com dados gravados. Para mais informações, consulte Create data tables e Write data.
Observações de uso
Ao chamar a operação PutRow, UpdateRow, DeleteRow ou BatchWriteRow para atualizar dados em uma tabela, especifique condições de existência de linha e condições baseadas em colunas para executar atualizações condicionais. O Tablestore atualiza os dados da tabela somente quando essas condições são satisfeitas.
As atualizações condicionais podem basear-se em condições de existência de linha e em condições baseadas em colunas.
-
Condições de existência de linha compatíveis: IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST.
Durante a atualização de uma tabela, 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 o sistema retorna um erro.
-
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 aceitam os operadores lógicos NOT, AND e OR. É possível definir 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 duas constantes.
CompositeCondition consiste em múltiplas RelationalConditions ou CompositeConditions. Defina as relações lógicas entre as subcondições.
Utilize atualizações condicionais para implementar bloqueio otimista. Ao atualizar uma linha, obtenha o valor de uma coluna específica e defina uma condição de atualização baseada nesse valor. Por exemplo, ao alterar o valor da Coluna A para 2, obtenha seu valor atual (neste caso, 1) e especifique que a atualização só deve ocorrer se o valor da Coluna A for igual a 1. Se a condição for atendida, a atualização será bem-sucedida. Caso outro cliente tenha atualizado a linha, a operação falhará.
Parâmetros
|
Parâmetro |
Descrição |
|
RowExistenceExpectation |
Durante a atualização de uma tabela, 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 o sistema retorna um erro. 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 utilizado para combinar múltiplas condições. Para mais informações, consulte LogicalOperator. Operadores lógicos compatíveis: NOT, AND e OR. A quantidade de subcondições necessárias varia conforme o operador lógico.
|
|
PassIfMissing |
Define se a verificação condicional é aprovada quando uma coluna não existe na linha. Este parâmetro é do tipo Boolean. O valor padrão é true, indicando que, se a coluna não existir, a verificação condicional é aprovada e a linha atende às condições de atualização. Se PassIfMissing estiver definido como false, a verificação condicional falhará quando a coluna não existir na linha. |
|
LatestVersionsOnly |
Indica se apenas o valor da versão mais recente deve ser usado quando a coluna possuir múltiplas versões. Este parâmetro é do tipo Boolean. O valor padrão é true, o que significa que, havendo várias versões, somente a mais recente será usada na comparação. Caso LatestVersionsOnly esteja definido como false e a coluna tenha múltiplas versões, todas serão consideradas na comparação. Nesse cenário, a verificação condicional será aprovada se qualquer uma das versões atender à condição. |
Exemplo
O código abaixo demonstra como atualizar dados com base em condições de coluna. A atualização ocorre apenas se o valor da coluna col0 for igual a 5; caso contrário, a operação falha.
// 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);
}