Saltar al contenido

Simultaneidad y Bloqueo de Eventos

Simultaneidad y Bloqueo

De manera predeterminada, los eventos se ejecutan simultáneamente. Si dos usuarios hacen clic en el mismo botón al mismo tiempo, las ejecuciones de los eventos pueden superponerse. En algunas situaciones, puede ser necesario sincronizar eventos. Los eventos sincronizados se ejecutan de manera serial, lo que garantiza que solo se ejecute un evento sincronizado a la vez. Los eventos no sincronizados pueden ejecutarse simultáneamente, incluso con eventos sincronizados.

Los eventos se sincronizan con bloqueos. Un bloqueo abarca la validación y las acciones del evento. Los bloqueos no sincronizan otras reglas, como los valores predeterminados o las reglas de visibilidad.

Nota

En un ambiente de varios servidores, los bloqueos distribuidos garantizan que los eventos se sincronicen en todo el clúster. Cuando se utiliza Redis como proveedor de estado compartido, se utiliza el algoritmo Redlock.

Para habilitar el bloqueo de eventos, marque la opción Usar bloqueo al crear o modificar el evento. Esto habilitará opciones de bloqueo adicionales. La opción Usar bloqueo está disponible en la pantalla de configuración de eventos, haciendo clic en Caso extremo.

Precaución

Tenga cuidado al elegir si desea bloquear un evento. La sincronización de eventos afecta negativamente el rendimiento.

Nombres de Bloqueo

Los bloqueos de eventos se denominan bloqueos. El nombre determina el alcance del bloqueo. Los eventos bloqueados que comparten el mismo nombre se sincronizarán. Esto permite a los desarrolladores sincronizar varios eventos. Por ejemplo, los desarrolladores pueden sincronizar los eventos Insertar, Actualizar y Eliminar para una tabla determinada. Los eventos de diferentes tablas incluso se pueden sincronizar entre sí si comparten el mismo nombre.

Si el desarrollador no especifica un nombre de bloqueo, se generará un nombre predeterminado en tiempo de ejecución. El nombre generado depende de si el evento es un evento de nivel de tabla o de nivel de fila. Los eventos de nivel de tabla incluyen los eventos intrínsecos Filter y New. Los eventos de nivel de fila incluyen los eventos intrínsecos Insert, Update y Delete, así como los eventos definidos por el usuario.

En el caso de los eventos a nivel de tabla, el ámbito de nombre predeterminado es el bloqueo de la tabla. Por ejemplo, bloquear el evento Filter de la tabla garantiza que solo se pueda ejecutar un evento Filter a la vez para la tabla en cuestión.

En el caso de los eventos a nivel de fila, el ámbito de nombre predeterminado es el bloqueo de una fila. Por ejemplo, bloquear el evento Update de la tabla garantiza que solo se pueda ejecutar un evento Update a la vez para una fila determinada. Dos eventos Update podrían ejecutarse simultáneamente para diferentes filas de la misma tabla.

Dado que los nombres de los bloqueos son globales, los desarrolladores deben tener cuidado de asignarles el espacio de nombres adecuado. Considere utilizar el siguiente patrón como base para nombrar los bloqueos:

data-source-name:table-name:event-name

Por ejemplo:

Fulfillment:Orders:Ship

Precaución

Si dos eventos comparten el mismo nombre de bloqueo, App Builder emitirá una advertencia para evitar colisiones accidentales.

Los nombres de bloqueo admiten la interpolación de cadenas. La interpolación de cadenas sustituye los valores de la fila actual en el nombre del bloqueo. Normalmente, los valores de la clave principal de la fila se sustituyen en el nombre para crear bloqueos con alcance de fila.

La sintaxis de la interpolación de cadenas es:

`{{ nombre-columna v }}``

Por ejemplo, dado el siguiente nombre de bloqueo:

Fulfillment:Orders:Ship:{{ ID de pedido }}

El nombre del bloqueo en tiempo de ejecución podría verse así:

Fulfillment:Orders:Ship:1234

Caducidad del Bloqueo

Normalmente, los bloqueos se mantienen hasta que el evento se completa, ya sea de manera exitosa o no. Si el evento no se completa en el tiempo previsto, afectará la disponibilidad del sistema. Para mitigar esto, los bloqueos de eventos expiran. Si el evento no se completa dentro del período de expiración, el bloqueo se libera. Sin embargo, tenga en cuenta que el evento puede continuar ejecutándose.

El vencimiento predeterminado es de 10 segundos. Los desarrolladores pueden cambiar el vencimiento según sea necesario. Se debe tener cuidado con valores de vencimiento más altos.

Bloqueo de Espera

Los bloqueos son exclusivos: solo un evento puede adquirir y mantener un bloqueo determinado a la vez. Otros eventos que intentan adquirir el bloqueo se ponen en cola. Permanecerán en cola hasta que adquieran el bloqueo a su vez o hasta que transcurra el período de espera del bloqueo.

El tiempo de espera predeterminado para el bloqueo es de 10 segundos. Los desarrolladores pueden cambiar el tiempo de espera según sea necesario. Si el vencimiento es relativamente bajo, considere usar un valor igual al vencimiento. Si el vencimiento es alto, considere usar un valor bajo para el período de espera del bloqueo. En otras palabras, si se espera que el bloqueo solo dure unos segundos, los usuarios generalmente están dispuestos a esperar hasta que el bloqueo esté disponible. Si, por otro lado, se espera que el bloqueo dure un minuto o más, generalmente es preferible agotar el tiempo de espera antes y notificar al usuario.

Si se alcanza el tiempo de espera del bloqueo, el usuario verá un mensaje de alerta: "El evento fue cancelado":

Herencia de Bloqueo

Los eventos admiten la herencia. Las validaciones y acciones definidas en una tabla física son heredadas por los eventos de objetos de datos del mismo nombre. Los eventos también heredan la configuración de bloqueo. Si el evento Update de la tabla física está bloqueado, entonces el evento Update del objeto de datos también está bloqueado.

La herencia de bloqueo también se aplica al evento Save. El evento Save no es un evento de primera clase. En cambio, sus validaciones y acciones se fusionan en los eventos Insert y Update en tiempo de ejecución. Esto permite a los desarrolladores registrar una regla una vez y hacer que se aplique tanto a las inserciones como a las actualizaciones. De manera similar, bloquear el evento Save bloqueará los eventos Insert y Update.

App Builder sintetiza un evento Change en tiempo de ejecución utilizando validaciones de los eventos Insert o Update. El evento Change se ejecuta cuando un usuario modifica un valor de campo. Si el evento Insert o Update está bloqueado, entonces el evento Change también estará bloqueado.