Con frecuencia se necesita gestionar posibles conflictos que puedan surgir cuando varios usuarios o procesos cargan e intentan modificar las mismas entidades al mismo tiempo. El bloqueo de registros es una metodología utilizada en bases de datos relacionales para evitar actualizaciones incoherentes de los datos. El concepto es bloquear un registro después de la lectura para que ningún otro proceso pueda actualizarlo o, alternativamente, verificar cuando se guarda un registro para verificar que algún otro proceso no lo haya modificado desde que se leyó. El primero se conoce como bloqueo pesimista de registros y garantiza que se pueda escribir un registro modificado a expensas de bloquear los registros a otros usuarios. El último se denomina bloqueo de registros optimista e intercambia la garantía de privilegios de escritura en el registro por la flexibilidad de decidir los privilegios de escritura solo si es necesario actualizar el registro. En el bloqueo pesimista de registros, el registro está bloqueado incluso si no hay necesidad de actualizarlo. En el bloqueo de registros optimista, la validez de la modificación de un registro se decide en el momento de la actualización.
ORDA le ofrece dos modos de bloqueo de entidades:
- un modo automático "optimista", adecuado para la mayoría de las aplicaciones,
- un modo "pesimista" que le permite bloquear entidades antes de su acceso.
Este mecanismo automático se basa en el concepto de "bloqueo optimista", que es especialmente adecuado para los problemas de las aplicaciones web. Este concepto se caracteriza por los siguientes principios operativos:
- Todas las entidades siempre se pueden cargar en lectura-escritura; no hay un "bloqueo" a priori de las entidades.
- Cada entidad tiene un sello de bloqueo interno que se incrementa cada vez que se guarda.
- Cuando un usuario o proceso intenta guardar una entidad utilizando el método entity.save( ), 4D compara el valor del sello de la entidad que se guardará con el de la entidad encontrada en los datos (en el caso de un modificación):
- Cuando los valores coinciden, la entidad se guarda y el valor de sello interno se incrementa.
- Cuando los valores no coinciden, significa que otro usuario ha modificado esta entidad mientras tanto. El guardado no se realiza y se devuelve un error.
El siguiente diagrama ilustra el bloqueo optimista:
1. Dos procesos cargan la misma entidad.

2. El primer proceso modifica la entidad y valida el cambio. Se llama al método entity.save( ). El motor 4D compara automáticamente el valor de sello interno de la entidad modificada con el de la entidad almacenada en los datos. Como coinciden, la entidad se guarda y su valor de sello se incrementa.

3. El segundo proceso también modifica la entidad cargada y valida sus cambios. Se llama al método entity.save( ). Como el valor de sello de la entidad modificada no coincide con el de la entidad almacenada en los datos, no se realiza el guardado y se devuelve un error.

Esto también se puede ilustrar con el siguiente código:
$person1:=ds.Person.get(1)
$person2:=ds.Person.get(1)
$person1.name:="Bill"
$result:=$person1.save()
$person2.name:="William"
$result:=$person2.save()
En este ejemplo, asignamos a $person1 una referencia a la entidad person con una llave de 1. Luego, asignamos otra referencia de la misma entidad a la variable $person2. Usando $person1, cambiamos el primer nombre de la persona y guardamos la entidad. Cuando intentamos hacer lo mismo con $person2, 4D verifica que la entidad en el disco sea la misma que cuando se asignó por primera vez la referencia en $person1. Como no es lo mismo, devuelve falso en la propiedad success property y no guarda la segunda modificación.
Cuando se produce esta situación, puede, por ejemplo, volver a cargar la entidad desde el disco utilizando el método entity.reload( ) para que pueda intentar realizar la modificación nuevamente. El método entity.save( ) también ofrece una opción "automerge" para guardar la entidad en el caso de que los procesos modifiquen atributos que no eran los mismos.
Nota: los sellos de registro no se utilizan en transacciones porque en este contexto sólo existe una única copia de un registro. Sea cual sea el número de entidades que hacen referencia a un registro, se modifica la misma copia, por lo que las operaciones entity.save( ) nunca generarán errores de sello.
Puede bloquear y desbloquear entidades según la demanda al acceder a los datos. Cuando una entidad está siendo bloqueada por un proceso, se carga en lectura/escritura en este proceso, pero está bloqueada para todos los demás procesos. La entidad solo puede cargarse en modo de solo lectura en estos procesos; sus valores no pueden ser editados ni guardados.
Esta funcionalidad se basa en dos métodos de la clase de entidad:
Para más información, consulte las descripciones de estos métodos.
El uso de comandos classic y de métodos ORDA para bloquear registros se basa en los siguientes principios:
- Un bloqueo configurado con un comando 4D classic en un registro evita que ORDA bloquee toda entidad que coincide con el registro.
- Un bloqueo definido con ORDA en una entidad impide que los comandos 4D classic bloqueen el registro que coincide con la entidad.
Estos principios se muestran en el siguiente diagrama:

Los bloqueos de transacción también se aplican a los comandos 4D classic y a los métodos ORDA. En una aplicación multiproceso o multiusuario, un bloqueo definido dentro de una transacción en un registro por un comando 4D classic resultará en evitar que cualquier otro proceso bloquee las entidades relacionadas con este registro (o por el contrario), hasta que la transacción sea validada o cancelada.
- Ejemplo con un bloqueo definido por un comando clásico:

- Ejemplo con un bloqueo definido por un método ORDA:
