Nous commençons par le concept de blocage optimiste, qui est basé sur des ETags (balises d'entité). Pour activer les ETags pour une entité de modèle, ajoutez l'annotation @odata.etag à un élément de la définition d'entité.
Dans l'exemple illustré, l'élément modifiedAt de l'aspect géré est défini comme élément ETag à la fois pour l'entité Books et l'entité Authors. La directive annotate est utilisée à cet effet, ce qui permet d'annoter les définitions existantes.
Remarque
Les éléments dont le contenu change de manière unique chaque fois qu'un enregistrement de données est mis à jour sont appropriés comme élément ETag. Par conséquent, l'élément modifiedAt de l'aspect géré prédéfini est un bon candidat. Vous pouvez également utiliser des compteurs de mise à jour ou des UUID qui sont recalculés à chaque mise à jour.
L'idée d'un ETag est d'identifier une version spécifique d'une entité, dans notre exemple la version d'un livre ou d'un auteur. Cela peut être utilisé pour garantir l'intégrité des données, comme expliqué dans l'exemple suivant, sans utiliser de verrous.
Supposons que nous récupérions un auteur spécifique via la demande suivante car nous voulons modifier ses données :
1
GET Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2)
Avec cette requête, la version de l'auteur, c'est-à-dire la valeur de l'élément ETag modifiedAt, est automatiquement retournée via l'en-tête de réponse HTTP ETag , par exemple :
1
ETag: W/"2024-03-15T11:30:48.069Z"
Pour réécrire les données modifiées sur l'auteur, la valeur ETag reçue est utilisée comme suit dans l'en-tête HTTP If-Match de la demande de modification correspondante :
1234567
PUT Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2)
If-Match: W/"2024-03-15T11:30:48.069Z"
Content-Type: application/json
{
...
}
CAP vérifie ensuite si le contenu de l'élément modifiedAt a été modifié entre-temps. Si ce n'est pas le cas, les données de l'auteur sont modifiées dans la base de données et la zone modifiedAt ETag est mise à jour. Si oui, cela signifie que l'auteur a été modifié via une autre demande depuis la lecture des données. CAP interrompt donc la demande de modification et active le code de statut 412 (Échec de la condition préalable) pour la réponse HTTP. Le corps de la réponse contient une erreur similaire à ce qui suit :
12345
"error": {
"code": "412",
"message": "Precondition Failed",
"@Common.numericSeverity": 4
}