Saltar al contenido principal
Versión: v20 R4 BETA

$lock

Bloquea y desbloquea una entidad utilizando el mecanismo pesimista.

Sintaxis

Para bloquear una entidad para las otras sesiones y procesos 4D:

/?$lock=true

Para desbloquear la entidad para las otras sesiones y procesos 4D:

/?$lock=false

La propiedad lockKindText es "Locked by session".

Descripción

Los bloqueos activados por la API REST se colocan al nivel de la sesión.

Una entidad bloqueada se ve como bloqueada (es decir, las acciones de bloqueo / desbloqueo / actualización / eliminación no son posibles) por:

  • otras sesiones REST
  • los procesos 4D (cliente/servidor, almacén de datos remoto, monopuesto) ejecutadas en el servidor REST.

Una entidad bloqueada por la API REST sólo puede ser desbloqueada:

  • por su bloqueador, es decir un /?$lock=false en la sesión REST que define /?$lock=true
  • o si el timeout de inactividad de la sesión se alcanza (la sesión se cierra).

Respuesta

Una petición ?$lock devuelve un objeto JSON con "result"=true si la operación de bloqueo se reutiliza y "result"=false si falla.

El objeto "__STATUS" devuelto tiene las siguientes propiedades:

PropiedadTipoDescripción
Disponible sólo en caso de éxito:
successbooleantrue si la acción de bloqueo tiene éxito (o si la entidad ya está bloqueada en la sesión actual), false en caso contrario (no devuelto en este caso).
Disponible sólo en caso de error:
statusnumberCódigo de error, ver abajo
statusTexttextDescripción del error, ver abajo
lockKindnumberCódigo de bloqueo
lockKindTexttext"Locked by session" si está bloqueado por una sesión REST, "Locked by record" si está bloqueado por un proceso 4D
lockInfoobjectInformación sobre el origen del bloqueo. Las propiedades devueltas dependen del origen del bloqueo (proceso 4D o sesión REST).
Disponible sólo para un bloqueo por proceso 4D:
task_idnumberID del Proceso
user_nametextNombre de usuario de la sesión en la máquina
user4d_aliastextNombre o alias del usuario 4D
user4d_idnumberID del usuario en el directorio de la base de datos 4D
host_nametextNombre de la máquina
task_nametextNombre del proceso
client_versiontextVersión del cliente
Disponible sólo para un bloqueo por sesión REST:
hosttextURL que bloqueó la entidad (por ejemplo, "127.0.0.1:8043")
IPAddrtextDirección IP del bloqueo (por ejemplo: "127.0.0.1")
recordNumbernumberNúmero del registro bloqueado
userAgenttextuserAgent del origin del bloqueo (ej: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36")

Los siguientes valores pueden ser devueltos en las propiedade status y statusText del objeto __STATUS en caso de error:

statusstatusTextComentario
2"Stamp has changed"El valor del sello interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
3"Already locked"La entidad está bloqueada por un bloqueo pesimista.
4"Other error"Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc.
5"Entity does not exist anymore"La entidad ya no existe en los datos.

Ejemplo

Bloqueamos una entidad en un primer navegador:

GET /rest/Customers(1)/?$lock=true

Respuesta:

{
"result": true,
"__STATUS": {
"success": true
}
}

En un segundo navegador (otra sesión), enviamos la misma petición.

Respuesta:

{
"result":false,
"__STATUS":{
"status":3,
"statusText":"Already Locked",
"lockKind":7,
"lockKindText":"Locked By Session",
"lockInfo":{
"host":"127.0.0.1:8043",
"IPAddr":"127.0.0.1",
"recordNumber": 7,
"userAgent": ""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36..."
}
}
}