Saltar al contenido

Simultaneidad y Bloqueo de Eventos

Simultaneidad y Bloqueo

De forma predeterminada, los eventos se ejecutan simultáneamente. Si dos usuarios hacen clic en el mismo botón al mismo tiempo, las ejecuciones de eventos pueden superponerse. En algunas situaciones, puede ser necesario sincronizar eventos. Los eventos sincronizados se ejecutan en serie, lo que garantiza que solo se ejecute un evento sincronizado a la vez. Los eventos no sincronizados aún 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 las reglas predeterminadas o de visibilidad.

Nota

En un ambiente de múltiples 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. Usar bloqueo está disponible desde la pantalla de configuración de eventos, haciendo clic en Edge Case.

Precaución

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

Bloquear Nombres

Los bloqueos de eventos se denominan bloqueos. El nombre determina el alcance del bloqueo. Se sincronizarán los eventos bloqueados que compartan el mismo nombre. Esto permite a los desarrolladores sincronizar múltiples eventos. Por ejemplo, los desarrolladores pueden sincronizar los eventos Insertar, Actualizar y Eliminar de 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 a nivel de tabla o un evento a nivel de fila. Los eventos a nivel de tabla incluyen los eventos Filtro y Nuevo intrínsecos. Los eventos a nivel de fila incluyen los eventos intrínsecos Insertar, Actualizar y Eliminar, así como eventos definidos por el usuario.

Para eventos a nivel de tabla, el alcance del nombre predeterminado es el bloqueo de la tabla. Bloquear el evento de filtro de la tabla, por ejemplo, garantiza que solo se pueda ejecutar un evento de filtro a la vez para la tabla determinada.

Para eventos a nivel de fila, el alcance del nombre predeterminado es el bloqueo de una fila. Bloquear el evento de actualización de la tabla, por ejemplo, garantiza que solo se pueda ejecutar un evento de actualización a la vez para una fila determinada. Se podrían ejecutar dos eventos de actualización simultáneamente para diferentes filas en la misma tabla.

Debido a que los nombres de los bloqueos son globales, los desarrolladores deben tener cuidado de asignar correctamente los nombres de los bloqueos al espacio. Considere utilizar el siguiente patrón como base al nombrar bloqueos:

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

Por ejemplo:

Fulfillment:Orders:Ship

Precaución

Si dos eventos comparten el mismo nombre de bloqueo, Vinyl 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 clave principal de la fila se sustituyen en el nombre para crear bloqueos con alcance de fila.

La sintaxis de interpolación de cadenas es:

{{ nombre-columna }}

Por ejemplo, dado el siguiente nombre de bloqueo:

Fulfillment:Orders:Ship:{{IdPedido }}

El nombre del bloqueo de 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, con éxito o no. Si el evento no se completa a tiempo, afectará la disponibilidad del sistema. Para mitigar esto, los bloqueos de eventos caducan. Si el evento no se completa dentro del período de vencimiento, se libera el bloqueo. Sin embargo, tenga en cuenta que el evento puede continuar ejecutándose.

La caducidad predeterminada es de 10 segundos. Los desarrolladores pueden cambiar el vencimiento según sea necesario. Se debe tener precaución con valores de caducidad más altos.

Bloquear Esperar

Los candados son exclusivos: sólo un evento puede adquirir y mantener un candado determinado a la vez. Otros eventos que intentan adquirir el bloqueo están en cola. Permanecerán en cola hasta que adquieran el candado por turno o hasta que haya transcurrido el período de espera del candado.

La espera de bloqueo predeterminada es de 10 segundos. Los desarrolladores pueden cambiar la 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 normalmente están dispuestos a esperar a que el bloqueo esté disponible. Si, por otro lado, se espera que el bloqueo dure un minuto o más, generalmente es preferible finalizar la espera antes y notificar al usuario.

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

Bloquear Herencia

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

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

Vinyl sintetiza un evento de cambio en tiempo de ejecución utilizando validaciones de los eventos Insertar o Actualizar. El evento Cambiar se ejecuta cuando un usuario modifica un valor de campo. Si el evento Insertar o Actualizar está bloqueado, el evento Cambiar también estará bloqueado.