Buscando una recomendación sobre el bloqueo de registros dentro de un sistema distribuido

StackOverflow https://stackoverflow.com/questions/207724

  •  03-07-2019
  •  | 
  •  

Pregunta

Estamos tratando de crear un patrón de diseño recomendado para nuestro equipo cuando se trata del bloqueo de registros. La típica escuela de pensamiento es algo así: 1. El usuario elige un registro de una lista 2. Bloquee el registro con el ID de usuario. 3. Cargue el registro de registro bloqueado (sin bloqueo, luego alguien le pegó).

¿Me estoy perdiendo algo o parece que esta es la única forma de hacerlo? ((En nuestro caso, el bloqueo optimista resultaría engorroso y confuso para los usuarios finales. Las ediciones a menudo son bastante sustanciales.))

¿Fue útil?

Solución

El detalle que podría hacer que la administración de su solución sea intensiva es deshacerse de los bloqueos luego de fallas o fallas de conectividad. Ahí es donde radica realmente la compensación entre el bloqueo optimista y pesimista. Combinar manualmente, o rehacer, las ediciones cuando falla el bloqueo optimista es una molestia, pero limpiar después de choques en modelos de bloqueo pesimistas y persistentes crea sus propios dolores de cabeza (como cualquier persona que apoyó a los usuarios de los sistemas de contabilidad respaldados por Pervasive en los años 90 le dirá en detalle la oportunidad)

Una respuesta es usar los mecanismos de su RDBMS para administrar las transacciones y la concurrencia: tome el registro con SELECT FOR UPDATE o la sintaxis que se adapte a su entorno y nivel de aislamiento. Si uno de sus clientes falla o se desconecta, la transacción se revierte y el bloqueo se libera.

En un entorno sin conexión como la web o en un entorno donde las conexiones se pierden y se recuperan con frecuencia, un modelo basado en sesión con un tiempo de espera de sesión también podría funcionar:

  • Intente borrar el bloqueo existente en el registro si es para una sesión caducada
  • Intente bloquear el registro para el sessionid (falla si el paso anterior falló)
  • Seleccione el registro bloqueado (no se devolvió ningún registro si el paso anterior falló)

Por lo tanto, el bloqueo se libera cuando la sesión expira. No es necesario eliminar manualmente los bloqueos después de los bloqueos y cierta tolerancia de los problemas de conectividad / cliente. Sin embargo, toma un poco más de trabajo codificar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top