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.
Para obter informações sobre os erros que podem ocorrer ao usar o recurso de atualização condicional, consulte Códigos de erro.
Pré-requisitos
Instância OTSClient inicializada. Para mais informações, consulte Inicializar uma instância OTSClient.
Tabela de dados criada com dados gravados.
Observações de uso
Ao chamar as operações PutRow, UpdateRow, DeleteRow ou BatchWriteRow para atualizar dados, use a atualização condicional para verificar condições de existência de linha e condições baseadas em colunas. A atualização só é bem-sucedida quando todas as condições são atendidas.
A atualização condicional pode ser baseada em condições de existência de linha e em condições baseadas em colunas.
-
As condições de existência de linha incluem IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST.
Ao modificar uma tabela de dados, o Tablestore verifica primeiro a condição de existência da linha. Se essa condição não for atendida, a modificação falha e um erro é retornado.
-
As condições baseadas em colunas incluem SingleColumnCondition e CompositeCondition, usadas para determinar se as condições são atendidas com base nos valores de uma ou mais colunas.
Essas condições suportam os seguintes operadores relacionais: =, !=, >, >=, < e <=. Também aceitam os operadores lógicos NOT, AND e OR. É possível especificar até 10 condições baseadas em colunas para uma atualização condicional.
SingleColumnCondition permite comparar uma constante com uma coluna, que pode ser uma chave primária. Não há suporte para comparação entre duas colunas ou entre duas constantes.
Operadores lógicos combinam subcondições em CompositeCondition. Essas subcondições podem ser do tipo SingleColumnCondition ou CompositeCondition.
Use a atualização condicional para implementar bloqueio otimista. Ao atualizar uma linha, obtenha o valor de uma coluna específica e defina uma condição de atualização com base nesse valor. Por exemplo, ao alterar o valor da Coluna A para 2, verifique seu valor atual. Neste exemplo, suponha que o valor obtido seja 1. Nesse caso, especifique que a linha só pode ser atualizada se o valor da Coluna A for igual a 1. Se a condição for atendida, a atualização será bem-sucedida. Se outro cliente tiver modificado a linha anteriormente, a atualização falhará.
Parâmetros
|
Parâmetro |
Descrição |
|
RowExistenceExpectation |
Condição de existência da linha. Durante a modificação de uma tabela, o Tablestore verifica essa condição. Se ela não for atendida, a operação falha e um erro é retornado. As condições de existência de linha incluem IGNORE, EXPECT_EXIST e EXPECT_NOT_EXIST. No Tablestore, RowExistenceExpectation_IGNORE representa IGNORE, RowExistenceExpectation_EXPECT_EXIST representa EXPECT_EXIST e RowExistenceExpectation_EXPECT_NOT_EXIST representa EXPECT_NOT_EXIST.
|
|
column_name |
Nome da coluna. |
|
column_value |
Valor usado para comparação na coluna. |
|
comparator |
Operador relacional utilizado para comparar valores de coluna. Para mais informações, consulte ComparatorType. Os operadores relacionais incluem EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<) e LESS_EQUAL(<=). No Tablestore, CT_EQUAL representa EQUAL(=), CT_NOT_EQUAL representa NOT_EQUAL(!=), CT_GREATER_THAN representa GREATER_THAN(>), CT_GREATER_EQUAL representa GREATER_EQUAL(>=), CT_LESS_THAN representa LESS_THAN(<) e CT_LESS_EQUAL representa LESS_EQUAL(<=). |
|
combinator |
Operador lógico usado para combinar múltiplas condições. Para mais informações, consulte LogicalOperator. Os operadores lógicos incluem NOT, AND e OR. No Tablestore, LO_NOT representa NOT, LO_AND representa AND e LO_OR representa OR. O número de subcondições permitidas varia conforme o operador lógico utilizado.
|
|
pass_if_missing |
Define se a verificação de condição deve ser aprovada quando uma coluna não existir na linha. Tipo: Booleano. Valores válidos:
|
|
latest_version_only |
Define se apenas a versão mais recente dos valores deve ser usada na comparação quando uma coluna possuir múltiplas versões. Tipo: Booleano. Valores válidos:
|
Exemplos
O código de exemplo abaixo demonstra como configurar a atualização condicional para modificar uma linha com base na chave primária especificada. Neste cenário, a atualização só ocorre se a linha existir e o valor da coluna age for igual a 20. Se a linha não existir ou se o valor da coluna age for diferente de 20, a operação falhará.
def update_row_with_condition(client):
table_name = "<TABLE_NAME>"
primary_key = [('gid',1), ('uid',"101")]
update_of_attribute_columns = {
'PUT' : [('name','David'), ('address','Hongkong')],
'DELETE' : [('address', None, 1488436949003)],
'DELETE_ALL' : [('mobile'), ('age')],
'INCREMENT' : [('counter', -1)]
}
row = Row(primary_key, update_of_attribute_columns)
# Specify that the update is successful only if the following conditions are met. Otherwise, the update fails.
# (1) The specified row exists.
# (2) The value of the age column in the specified row is 20.
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, SingleColumnCondition("age", 20, ComparatorType.EQUAL)) # Update the row only if the row exists.
consumed, return_row = client.update_row(table_name, row, condition)