¿Cómo implemento & # 8220; bloqueo pesimista & # 8221; en una aplicación de asp.net?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Me gustaría recibir consejos de cualquier persona con experiencia en la implementación de algo como " bloqueo pesimista " en una aplicación asp.net. Este es el comportamiento que estoy buscando:

  1. El usuario A abre la orden # 313
  2. El usuario B intenta abrir el pedido n. ° 313, pero se le dice que el usuario A ha tenido el pedido abierto exclusivamente por X minutos.

Como no he implementado esta funcionalidad anteriormente, tengo algunas preguntas de diseño:

  • ¿Qué datos debo adjuntar al registro del pedido? Estoy considerando:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

Consideraría un registro desbloqueado si LockRefreshedTime < (Ahora - 10 min).

  • ¿Cómo garantizo que los bloqueos no se mantengan durante más tiempo del necesario pero que tampoco caduquen inesperadamente?

Estoy bastante cómodo con jQuery, por lo que los enfoques que hacen uso del script del cliente son bienvenidos. Esta sería una aplicación web interna, por lo que puedo ser bastante liberal con mi uso de ancho de banda / ciclos. También me pregunto si " bloqueo pesimista " es un término apropiado para este concepto.

¿Fue útil?

Solución

Parece que estás casi todo el camino. No creo que realmente necesites LockRefreshedTime, en realidad no agrega nada. También puede usar LockAcquiredTime para decidir cuándo un bloqueo se ha agotado.

La otra cosa que querrá hacer es asegurarse de hacer uso de las transacciones. Debe ajustar la comprobación y la configuración del bloqueo dentro de una transacción de base de datos, para no terminar con dos usuarios que creen que tienen un bloqueo válido.

Si tiene tareas que requieren obtener bloqueos en más de un recurso (es decir, más de un registro de un tipo determinado o más de un tipo de registro), entonces debe aplicar los bloqueos en el mismo orden en el que se realice. . De lo contrario, puede tener un bloqueo muerto, donde un bit del código tiene el registro A bloqueado y desea bloquear el registro B y otro bit del código B está bloqueado y está esperando el registro A.

En cuanto a cómo garantizar que los bloqueos no se liberen inesperadamente. Asegúrese de que si tiene algún proceso de ejecución prolongada que pueda durar más que su tiempo de espera de bloqueo, que se actualice durante su ejecución.

El término " bloqueo explícito " También se utiliza para describir este tiempo de bloqueo.

Otros consejos

He hecho esto manualmente.

  • Almacene la clave principal del registro en una tabla de bloqueo y marque el registro atributo de modo para editar.
  • Cuando otro usuario intente seleccionar este registro, indique el usuario listo solo registro.
  • Tener un tiempo máximo de configuración para bloquear los registros.
  • Actualice los datos de la página para los registros bloqueados. Mientras un usuario tiene permiso para hacer cambios, todos los demás usuarios solo pueden verificar.

La tabla de bloqueo debe tener un diseño similar a este:

User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.

La lógica restante es algo que debes resolver.

Esta es solo una idea que implementé hace 4 años a petición especial de un cliente. Después de ese cliente, nadie me ha vuelto a pedir que haga algo similar, así que no he logrado ningún otro método.

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