2009-03-06 13 views
5

Me gustaría obtener algunos consejos de cualquier persona con experiencia en la implementación de algo así como "bloqueo pesimista" en una aplicación asp.net. Este es el comportamiento Busco:¿Cómo implemento el "bloqueo pesimista" en una aplicación asp.net?

  1. usuario abre un orden # 313
  2. intentos usuario B para abrir la orden # 313, pero se dijo que el usuario A ha tenido el fin abrió exclusivamente para X minutos.

Ya que no he implementado esta funcionalidad antes, tengo un par de preguntas de diseño:

  • ¿Qué datos deben adjuntarse al expediente de la orden? Estoy considerando:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

yo consideraría un registro bloqueado si el LockRefreshedTime < (Now - 10 min).

  • ¿Cómo puedo garantizar que los bloqueos no se mantengan durante más tiempo de lo necesario pero que no caduquen inesperadamente tampoco?

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, así que puedo ser bastante liberal con mi uso de ancho de banda/ciclos. También me pregunto si el "bloqueo pesimista" es un término apropiado para este concepto.

Respuesta

8

Parece que está todo el camino hasta allí. Aunque no creo que realmente necesites LockRefreshedTime, realmente no agrega nada. También puede usar LockAcquiredTime para decidir cuándo un bloqueo se ha quedado obsoleto.

La otra cosa que querrá hacer es asegurarse de hacer uso de las transacciones. Debe ajustar la verificación y la configuración del bloqueo dentro de una transacción de base de datos, para que no termine con dos usuarios que creen tener 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 necesita aplicar los bloqueos en el mismo orden donde sea que lo haga cierre. De lo contrario, puede tener un bloqueo muerto, donde un bit de código tiene el registro A bloqueado y quiere bloquear el registro B y otro bit de código tiene B bloqueado y está esperando el registro A.

¿Cómo se aseguran los bloqueos? lanzado inesperadamente Asegúrese de que si tiene un proceso de larga ejecución que podría durar más tiempo que el tiempo de espera de bloqueo, refresque su bloqueo durante su ejecución.

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

+0

+1 gran respuesta, gracias. Dejaré la pregunta sin respuesta durante 24 horas con la esperanza de fomentar más respuestas. –

+0

Tenga cuidado con la persona que va a almorzar/vacaciones mientras deja su navegador abierto. Considere si necesita algún tipo de IU para que los usuarios o un administrador rompan las cerraduras de otras personas. (Hablando desde la experiencia) –

1

He hecho esto manualmente.

  • Almacenar la clave principal del registro en una tabla de bloqueo y marcar el atributo de modo de edición para editar.
  • Cuando otro usuario intenta seleccionar este registro, indique el registro de solo del usuario listo.
  • Disponen de un tiempo máximo de configuración para bloquear los registros.
  • Actualizar datos de página para registros bloqueados. Mientras que un usuario puede hacer cambios, todos los demás usuarios solo pueden verificar.

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

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. 

lógica restante es algo que tienes que averiguar.

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

Cuestiones relacionadas