Le SDK Tablestore pour Java écrit, met à jour ou supprime une ligne uniquement si celle-ci satisfait la condition spécifiée.
Prérequis
Installez le SDK Tablestore pour Java et initialisez un client.
Description
L'objet Condition contient une condition d'existence de ligne (rowExistenceExpectation), une condition de colonne (columnCondition), ou les deux. Transmettez la condition configurée à la méthode setCondition() des objets RowPutChange, RowUpdateChange ou RowDeleteChange. Ces modifications de ligne peuvent également être incluses dans une requête BatchWriteRow. Si la condition n'est pas remplie, le serveur renvoie une erreur et la ligne reste inchangée.
rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)
L'exemple suivant met à jour la ligne dont la clé primaire est row1 dans la table condition_demo uniquement si la ligne existe. Dans le cas contraire, le serveur renvoie une erreur.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
Paramètres
Condition de mise à jour
L'objet Condition comprend les paramètres suivants. La condition d'existence de ligne et la condition de colonne peuvent être utilisées séparément ou conjointement. Aucune condition n'est évaluée lorsque rowExistenceExpectation est défini sur IGNORE et que columnCondition n'est pas défini.
|
Nom |
Type |
Description |
|
rowExistenceExpectation (facultatif) |
RowExistenceExpectation |
Condition d'existence de la ligne. Valeurs possibles :
|
|
columnCondition (facultatif) |
ColumnCondition |
Condition de colonne. Les sous-classes sont |
Condition de valeur de colonne unique
Lorsque Condition.columnCondition est un objet SingleColumnValueCondition, il contient les paramètres suivants.
|
Nom |
Type |
Description |
|
columnName (obligatoire) |
String |
Nom de la colonne d'attribut à vérifier. |
|
operator (obligatoire) |
CompareOperator |
Opérateur de comparaison. Valeurs possibles :
|
|
columnValue (obligatoire) |
ColumnValue |
Valeur à comparer. |
|
passIfMissing (facultatif) |
boolean |
Indique si la ligne est considérée comme satisfaisant la condition lorsque la colonne d'attribut cible est absente. Par défaut : Définissez cette valeur sur |
|
latestVersionsOnly (facultatif) |
boolean |
Indique s'il faut vérifier uniquement la dernière version des données. Par défaut : Définissez cette valeur sur |
Condition composite
Lorsque Condition.columnCondition est un objet CompositeColumnValueCondition, il contient les paramètres suivants. Ajoutez des sous-conditions à l'aide de la méthode addCondition(). Vous pouvez ajouter jusqu'à 32 sous-conditions.
|
Nom |
Type |
Description |
|
type (obligatoire) |
LogicOperator |
Opérateur logique. Valeurs possibles :
|
|
conditions (obligatoire) |
List<ColumnCondition> |
Sous-conditions pour l'opération logique. Ajoutez chaque sous-condition avec |
Exemples
Condition de valeur de colonne unique
Utilisez l'objet SingleColumnValueCondition pour vérifier la valeur d'une seule colonne d'attribut. L'exemple suivant met à jour la colonne col2 de la ligne dont la clé primaire est row1 uniquement si col1 == "changed_val1".
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col2", ColumnValue.fromString("new_val2"));
Condition condition = new Condition();
SingleColumnValueCondition singleCondition = new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("changed_val1"));
condition.setColumnCondition(singleCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
Condition de valeur de colonne composite
Utilisez l'objet CompositeColumnValueCondition pour combiner plusieurs conditions à l'aide d'opérateurs logiques. Vous pouvez imbriquer des conditions composites les unes dans les autres. L'exemple suivant construit la condition (col1 == "changed_val1" AND col2 == "new_val2") OR (col3 == "val3").
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("final_val1"));
// Sub-condition: col1 == "changed_val1" AND col2 == "new_val2"
CompositeColumnValueCondition andCondition = new CompositeColumnValueCondition(
CompositeColumnValueCondition.LogicOperator.AND);
andCondition.addCondition(new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("changed_val1")));
andCondition.addCondition(new SingleColumnValueCondition(
"col2",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("new_val2")));
// Top-level OR: (col1 AND col2) OR (col3)
CompositeColumnValueCondition orCondition = new CompositeColumnValueCondition(
CompositeColumnValueCondition.LogicOperator.OR);
orCondition.addCondition(andCondition);
orCondition.addCondition(new SingleColumnValueCondition(
"col3",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString("val3")));
Condition condition = new Condition();
condition.setColumnCondition(orCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
Empêcher les écrasements concurrents
Implémentez un mécanisme de type compare-and-swap avec une mise à jour conditionnelle : lisez d'abord la valeur actuelle, puis transmettez-la comme condition de mise à jour. La mise à jour réussit uniquement si la colonne contient toujours la valeur que vous avez lue. Si un autre processus modifie la colonne entre votre lecture et votre écriture, la mise à jour échoue. Cela vous empêche d'écraser l'écriture de ce processus.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
// 1. Read the current value.
SingleRowQueryCriteria queryCriteria = new SingleRowQueryCriteria("condition_demo", primaryKey);
queryCriteria.setMaxVersions(1);
GetRowResponse getResponse = client.getRow(new GetRowRequest(queryCriteria));
String oldValue = getResponse.getRow().getLatestColumn("col1").getValue().asString();
// 2. Perform a conditional update based on the value just read (only update if col1 still equals oldValue).
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("cas_updated"));
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
SingleColumnValueCondition casCondition = new SingleColumnValueCondition(
"col1",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromString(oldValue));
casCondition.setPassIfMissing(false);
casCondition.setLatestVersionsOnly(true);
condition.setColumnCondition(casCondition);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));