Comenzamos con el concepto de bloqueo optimista, que se basa en ETags (etiquetas de entidad). Para habilitar ETags para una entidad modelo, añada la anotación @odata.etag a un elemento de la definición de entidad.
En el ejemplo mostrado, el elemento modifiedAt del aspecto gestionado se define como elemento ETag tanto para la entidad Books como para la entidad Authors. Para ello se utiliza la directiva annotate , que permite anotar las definiciones existentes.
Nota
Los elementos cuyo contenido cambia de forma unívoca cada vez que se actualiza un registro de datos son adecuados como elemento ETag. Por lo tanto, el elemento modifiedAt del aspecto gestionado predefinido es un buen candidato. También puede utilizar contadores de actualización o UUID, que se vuelven a calcular en cada actualización.
La idea de un ETag es identificar una versión específica de una entidad, en nuestro ejemplo la versión de un libro o un autor. Esto se puede utilizar para garantizar la integridad de los datos, como se explica en el siguiente ejemplo, sin utilizar bloqueos.
Supongamos que recuperamos un autor específico a través de la siguiente solicitud porque queremos modificar sus datos:
1
GET Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2)
Con esta solicitud, la versión del autor, es decir, el valor del elemento ETag modifiedAt, se devuelve automáticamente a través de la cabecera de respuesta HTTP ETag , por ejemplo:
1
ETag: W/"2024-03-15T11:30:48.069Z"
Para reescribir datos modificados en el autor, el valor ETag recibido se utiliza de la siguiente manera en la cabecera HTTP If-Match de la solicitud de modificación correspondiente:
1234567
PUT Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2)
If-Match: W/"2024-03-15T11:30:48.069Z"
Content-Type: application/json
{
...
}
A continuación, CAP verifica si el contenido del elemento modifiedAt ha cambiado entretanto. Si no es así, los datos de autor se modifican en la base de datos y se actualiza el campo modifiedAt ETag. En caso afirmativo, esto significa que el autor se ha modificado mediante otra solicitud desde la lectura de los datos. Por lo tanto, CAP cancela la solicitud de modificación y fija el código de estado 412 (Condición previa fallida) para la respuesta HTTP. El cuerpo de la respuesta contiene un error similar al siguiente:
12345
"error": {
"code": "412",
"message": "Precondition Failed",
"@Common.numericSeverity": 4
}