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 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 se todas as condições forem atendidas.
A atualização condicional pode ser baseada em condições de existência de linha e 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 aceitam 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 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 baseada nesse valor. Por exemplo, ao alterar o valor da Coluna A para 2, obtenha seu valor atual (neste exemplo, 1). Em seguida, 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. Caso outro cliente tenha atualizado a linha nesse intervalo, a operaçã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 primeiramente esta condição. Se não for atendida, a operação falha e um erro é retornado. Os tipos 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.
|
|
ColumnName |
Nome da coluna. |
|
ColumnValue |
Valor de comparação da coluna. |
|
Comparator |
Operador relacional usado na comparação do valor da coluna. Para detalhes sobre os tipos de operadores, consulte ComparatorType. Os operadores disponíveis são EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<) e LESS_EQUAL(<=). No Tablestore, CT_EQUAL corresponde a EQUAL(=), CT_NOT_EQUAL a NOT_EQUAL(!=), CT_GREATER_THAN a GREATER_THAN(>), CT_GREATER_EQUAL a GREATER_EQUAL(>=), CT_LESS_THAN a LESS_THAN(<) e CT_LESS_EQUAL a LESS_EQUAL(<=). |
|
Operator |
Operador lógico usado para combinar múltiplas condições. Consulte LogicalOperator para mais informações sobre os tipos disponíveis. Inclui NOT, AND e OR. No Tablestore, LO_NOT indica NOT, LO_AND indica AND e LO_OR indica OR. A quantidade de subcondições permitidas varia conforme o operador lógico escolhido.
|
|
FilterIfMissing |
Define se a verificação de condição deve ser aprovada quando a coluna não existir na linha. Este parâmetro é do tipo Boolean. O valor padrão é false, indicando que a ausência da coluna resulta em aprovação da condição e a linha atende aos critérios de atualização. Se FilterIfMissing for definido como true e a coluna não existir, a verificação falha e a linha não atende às condições de atualização. |
|
LatestVersionsOnly |
Indica se apenas a versão mais recente do valor deve ser usada na comparação quando houver múltiplas versões. Parâmetro do tipo Boolean com valor padrão true, limitando a comparação à última versão disponível. Caso LatestVersionsOnly seja definido como false e existam várias versões, todas serão comparadas. Basta que uma delas atenda à condição para que a verificação seja aprovada e a linha elegível para atualização. |
Exemplos
Atualizar dados usando condições de existência de linha
O código abaixo demonstra como atualizar uma linha com base na chave primária. A operação só terá sucesso se a linha especificada já existir; caso contrário, falhará.
updateRowRequest := new(tablestore.UpdateRowRequest)
updateRowChange := new(tablestore.UpdateRowChange)
updateRowChange.TableName = tableName
updatePk := new(tablestore.PrimaryKey)
updatePk.AddPrimaryKeyColumn("pk1", "pk1value1")
updatePk.AddPrimaryKeyColumn("pk2", int64(2))
updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
updateRowChange.PrimaryKey = updatePk
updateRowChange.DeleteColumn("col1") // Delete the col1 column.
updateRowChange.PutColumn("col2", int64(77)) // Add the col2 column whose value is 77.
updateRowChange.PutColumn("col4", "newcol3") // Add the col4 column whose value is "newcol3".
// Specify that the row is expected to exist.
updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
updateRowRequest.UpdateRowChange = updateRowChange
_, err := client.UpdateRow(updateRowRequest)
if err != nil {
fmt.Println("update failed with error:", err)
} else {
fmt.Println("update row finished")
}
Atualizar dados usando condições de existência de linha e condições baseadas em colunas
-
Atualizar uma linha com condições
updateRowRequest := new(tablestore.UpdateRowRequest) updateRowChange := new(tablestore.UpdateRowChange) updateRowChange.TableName = tableName updatePk := new(tablestore.PrimaryKey) updatePk.AddPrimaryKeyColumn("pk1", "pk1value1") updateRowChange.PrimaryKey = updatePk updateRowChange.PutColumn("col2", int64(77)) // Add the col2 column whose value is 77. // Specify that the expected value of the col5 column is 3. clCondition1 := tablestore.NewSingleColumnCondition("col5", tablestore.CT_EQUAL, int64(3)) // The default value of the FilterIfMissing parameter is false, which specifies that if the column does not exist in a row, the condition check is passed. // If you want to specify that the condition check fails if the column does not exist in a row, set the FilterIfMissing parameter to true. //clCondition1.FilterIfMissing = true // Specify that the row is expected to exist. updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST) updateRowChange.SetColumnCondition(clCondition1) updateRowRequest.UpdateRowChange = updateRowChange _, err := client.UpdateRow(updateRowRequest) if err != nil { fmt.Println("update failed with error:", err) } else { fmt.Println("update row finished") } -
Excluir uma linha com condições
Este exemplo mostra como excluir uma linha com base na chave primária. A exclusão ocorre somente se a linha existir e o valor da coluna col2 for igual a 3.
deleteRowReq := new(tablestore.DeleteRowRequest) deleteRowReq.DeleteRowChange = new(tablestore.DeleteRowChange) deleteRowReq.DeleteRowChange.TableName = tableName deletePk := new(tablestore.PrimaryKey) deletePk.AddPrimaryKeyColumn("pk1", "pk1value1") deletePk.AddPrimaryKeyColumn("pk2", int64(2)) deletePk.AddPrimaryKeyColumn("pk3", []byte("pk3")) deleteRowReq.DeleteRowChange.PrimaryKey = deletePk // Specify that the row is expected to exist. deleteRowReq.DeleteRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST) // Specify that the expected value of the col2 column is 3. clCondition1 := tablestore.NewSingleColumnCondition("col2", tablestore.CT_EQUAL, int64(3)) // The default value of the FilterIfMissing parameter is false, which specifies that if the column does not exist in a row, the condition check is passed. // If you want to specify that the condition check fails if the column does not exist in a row, set the FilterIfMissing parameter to true. //clCondition1.FilterIfMissing = true deleteRowReq.DeleteRowChange.SetColumnCondition(clCondition1) _, err := client.DeleteRow(deleteRowReq) if err != nil { fmt.Println("delete failed with error:", err) } else { fmt.Println("delete row finished") }