Saltar para o conteúdo principal
Versão: v20 R4 BETA

$lock

Bloqueia e desbloqueia uma entidade utilizando o mecanismo pessimista.

Sintaxe

Para bloquear uma entidade para outras sessões e processos 4D:

/?$lock=true

Para desbloquear a entidade para outras sessões e processos 4D:

/?$lock=false

A propriedade lockKindText é "Locked by session".

Descrição

Os bloqueios accionados pela API REST são colocados ao nível da sessão.

Uma entidade bloqueada é vista como bloqueada (ou seja, as acções de bloquear/desbloquear/atualizar/eliminar não são possíveis) por:

  • outras sessões REST
  • Processos 4D (cliente/servidor, datastore remoto, autónomo) em execução no servidor REST.

Uma entidade bloqueada pela API REST só pode ser desbloqueada:

  • pelo seu locker, ou seja, um /?$lock=false na sessão REST que define /?$lock=true
  • ou se o tempo limite de inatividade da sessão for atingido (a sessão é encerrada).

Resposta

Um pedido ?$lock devolve um objeto JSON com "result"=true se a operação de bloqueio for bem sucedida e "result"=false se falhar.

O objeto "__STATUS" devolvido tem as seguintes propriedades:

PropriedadeTipoDescrição
Disponível apenas em caso de sucesso:
successbooleantrue se a ação de bloqueio for bem sucedida (ou se a entidade já estiver bloqueada na sessão atual), false caso contrário (não devolvido neste caso).
Disponível apenas em caso de erro:
statusnumberCódigo de erro, ver abaixo
statusTexttextDescrição do erro, ver abaixo
lockKindnumberCódigo de bloqueio
lockKindTexttext"Bloqueado por sessão" se bloqueado por uma sessão REST, "Bloqueado por registo" se bloqueado por um processo 4D
lockInfoobjectInformações sobre a origem do bloqueio. Retorna propriedades dependendo da origem da trava (processo 4D ou sessão REST)
Disponível só para um processo trava 4D:
task_idnumberProcess ID
user_nametextNome de usuário de sessão na máquina
user4d_aliastextNome ou apelido do usuário 4D
user4d_idnumberId do usuário no diretório do banco de dados 4D
host_nametextNome da máquina
task_nametextNome de processo
client_versiontextVersão do cliente
Disponível só para um processo trava REST:
hosttextURL que bloqueou a entidade (por exemplo, "127.0.0.1:8043")
IPAddrtextEndereço IP da trava (por exemplo. "127.0.0.1")
recordNumbernumberNúmero de registo do registo bloqueado
userAgenttextuserAgent of the locker (e.g. 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")

Os seguintes valores podem ser devolvidos nas propriedades status e statusText do objeto __STATUS em caso de erro:

statusstatusTextComentário
2"Stamp has changed"O valor de selo interno da entidade não corresponde a uma da entidade armazenada nos dados (bloqueio otimista).
3"Already locked"A entidade está fechada por uma fechadura pessimista.
4"Other error"Um erro grave é um erro de banco de dados de baixo nível (por exemplo, chave duplicada), um erro de hardware, etc.
5"Entity does not exist anymore"A entidade não existe mais nos dados.

Exemplo

Bloqueamos uma entidade num primeiro navegador:

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

Responsa:

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

Num segundo navegador (outra sessão), enviamos o mesmo pedido.

Responsa:

{
"result":false,
"__STATUS":{
"status":3,
"statusText":"Already Locked",
"lockKind":7,
"lockKindText":"Locked By Session",
}
}
}
}
}