Tous les produits
Search
Centre de documentation

Tablestore:Utiliser des mises à jour conditionnelles

Dernière mise à jour :Aug 18, 2026

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 :

  • IGNORE (par défaut) : Ignore la vérification de l'existence de la ligne.

  • EXPECT_EXIST : Correspond lorsque la ligne cible existe dans la table.

  • EXPECT_NOT_EXIST : Correspond lorsque la ligne cible n'existe pas dans la table.

columnCondition (facultatif)

ColumnCondition

Condition de colonne. Les sous-classes sont SingleColumnValueCondition pour les vérifications sur une seule colonne et CompositeColumnValueCondition pour les vérifications combinées.

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 :

  • EQUAL

  • NOT_EQUAL

  • GREATER_THAN

  • GREATER_EQUAL

  • LESS_THAN

  • LESS_EQUAL

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 : true (la colonne manquante est considérée comme satisfaisant la condition).

Définissez cette valeur sur false pour considérer qu'une colonne manquante ne satisfait pas la condition.

latestVersionsOnly (facultatif)

boolean

Indique s'il faut vérifier uniquement la dernière version des données. Par défaut : true.

Définissez cette valeur sur false pour faire correspondre la condition si n'importe quelle version la satisfait.

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 :

  • AND. Ajoutez au moins deux sous-conditions.

  • OR. Ajoutez au moins deux sous-conditions.

  • NOT. Ajoutez exactement une sous-condition.

conditions (obligatoire)

List<ColumnCondition>

Sous-conditions pour l'opération logique. Ajoutez chaque sous-condition avec addCondition(). Une sous-condition peut être un objet SingleColumnValueCondition ou un autre objet CompositeColumnValueCondition — utilisez la forme composite pour imbriquer les conditions.

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));