La fonctionnalité de mise à jour conditionnelle vous permet de mettre à jour les données d'une table uniquement si les conditions spécifiées sont remplies. Si les conditions ne sont pas satisfaites, la mise à jour échoue.
Prérequis
Une instance OTSClient est initialisée. Pour plus d'informations, consultez la rubrique Initialiser une instance OTSClient.
Une table de données a été créée et des données y ont été écrites. Pour plus d'informations, consultez les rubriques Créer des tables de données et Écrire des données.
Notes d'utilisation
Lorsque vous appelez l'opération PutRow, UpdateRow, DeleteRow ou BatchWriteRow pour mettre à jour les données d'une table, vous pouvez spécifier des conditions d'existence de ligne et des conditions basées sur les colonnes afin d'effectuer des mises à jour conditionnelles. Les données de la table ne sont mises à jour que si ces conditions sont remplies.
Les mises à jour conditionnelles s'appuient sur deux types de conditions : les conditions d'existence de ligne et les conditions basées sur les colonnes.
-
Les conditions d'existence de ligne suivantes sont prises en charge : IGNORE, EXPECT_EXIST et EXPECT_NOT_EXIST.
Lors de la mise à jour d'une table de données, Tablestore vérifie d'abord si les conditions d'existence de ligne sont satisfaites. Dans le cas contraire, la mise à jour échoue et une erreur est renvoyée.
-
Les conditions basées sur les colonnes incluent RelationalCondition et CompositeCondition. Elles permettent de déterminer si les conditions sont remplies en fonction des valeurs d'une ou plusieurs colonnes.
Ces conditions prennent en charge les opérateurs relationnels suivants : =, !=, >, >=, < et <=. Elles supportent également les opérateurs logiques NOT, AND et OR. Vous pouvez spécifier jusqu'à 10 conditions basées sur les colonnes lors d'une mise à jour conditionnelle.
RelationalCondition permet de comparer une colonne à une constante. La comparaison entre deux colonnes ou entre deux constantes n'est pas prise en charge.
CompositeCondition regroupe plusieurs conditions RelationalCondition ou CompositeCondition. Vous devez spécifier les relations logiques entre les sous-conditions.
Vous pouvez utiliser les mises à jour conditionnelles pour implémenter un verrouillage optimiste. Lors de la mise à jour d'une ligne, vous devez obtenir la valeur d'une colonne spécifique et définir une condition de mise à jour basée sur cette valeur. Par exemple, pour modifier la valeur de la colonne A d'une ligne et la passer à 2, vous devez d'abord récupérer sa valeur actuelle (supposons qu'elle soit égale à 1). Ensuite, vous spécifiez que la mise à jour ne doit s'effectuer que si la valeur de la colonne A est bien 1. Si la condition est remplie, la mise à jour réussit. En revanche, si un autre client a modifié la ligne entre-temps, la mise à jour échoue.
Paramètres
|
Paramètre |
Description |
|
RowExistenceExpectation |
Lors de la mise à jour d'une table de données, Tablestore vérifie d'abord si les conditions d'existence de ligne sont satisfaites. Si ce n'est pas le cas, la mise à jour échoue et une erreur est renvoyée. Les conditions d'existence de ligne suivantes sont prises en charge : IGNORE, EXPECT_EXIST et EXPECT_NOT_EXIST.
|
|
ColumnName |
Nom de la colonne. |
|
ColumnValue |
Valeur à comparer avec la colonne. |
|
Operator |
Opérateur relationnel utilisé pour comparer les valeurs. Pour plus d'informations, consultez la rubrique ComparatorType. Les opérateurs relationnels suivants sont pris en charge : =, !=, >, >=, < et <=. |
|
LogicOperator |
Opérateur logique utilisé pour combiner plusieurs conditions. Pour plus d'informations, consultez la rubrique LogicalOperator. Les opérateurs relationnels suivants sont pris en charge : NOT, AND et OR. Le nombre de sous-conditions requises varie selon l'opérateur logique utilisé.
|
|
PassIfMissing |
Indique si la vérification conditionnelle est considérée comme réussie lorsqu'une colonne est absente d'une ligne. Ce paramètre est de type booléen. La valeur par défaut est true, ce qui signifie que si la colonne n'existe pas dans la ligne, la vérification conditionnelle réussit et la ligne satisfait aux conditions de mise à jour. Si le paramètre PassIfMissing est défini sur false, la vérification conditionnelle échoue lorsque la colonne est absente de la ligne. |
|
LatestVersionsOnly |
Indique si seule la valeur de la dernière version est utilisée lorsque la colonne contient plusieurs versions de données. Ce paramètre est de type booléen. La valeur par défaut est true, ce qui signifie que si la colonne possède plusieurs versions de données, seule la valeur de la dernière version est utilisée pour la comparaison. Si le paramètre LatestVersionsOnly est défini sur false, les valeurs de toutes les versions de la colonne sont utilisées pour la comparaison lorsque celle-ci contient plusieurs versions de données. Dans ce cas, la vérification conditionnelle réussit si l'une des versions satisfait à la condition. |
Exemple
L'exemple de code suivant illustre comment mettre à jour des données en fonction de conditions basées sur les colonnes. Les données sont mises à jour si la valeur de la colonne col0 est égale à 5. Sinon, la mise à jour échoue.
// 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);
}