2009-03-18 12 views
6

Estoy construyendo una aplicación con los siguientes criterios:pesimista frente concurrencia optimista (Bloqueo contra Comentarios)

  • elementos de trabajo: los tejidos que necesitan ser resueltos de forma manual a través de la web por los usuarios (forma corta una página)
  • que varios usuarios trabajen 'elementos de trabajo'
  • Cada usuario tiene una cola de 'elementos de trabajo'
  • Hay una búsqueda que permite a los usuarios ver 'elementos de trabajo' y asignar 'elementos de trabajo' a sus colas
  • Usuarios puede sacar 'elementos de trabajo' de las colas de otras personas asignándoselos a sí mismos

Nota: los 'elementos de trabajo' se trabajan solo una vez. Esta no es una página wiki, es más un ejercicio de coincidencia que solo debe realizarlo un usuario. Una vez que el 'elemento de trabajo' se ha trabajado, se ha ido del sistema (aparte de algunas auditorías/informes), algo así como un sistema de seguimiento de errores

¿Qué opción crees que es mejor? ¿Puedes citar alguna aplicación convencional que apoye tu opinión?

Opción 1:

  • Cuando el usuario A va a ver o trabajar un 'elemento de trabajo', el 'elemento de trabajo' se bloquea.
  • Cuando otros usuarios van al 'elemento de trabajo' después de que el Usuario A abre el 'elemento de trabajo', solo podrán ver el 'elemento de trabajo'. Ellos no pueden escribir
  • El bloqueo expira después de n minutos, momento en el que otro usuario puede bloquear el 'elemento de trabajo'.

Opción 2:

  • Cualquier usuario puede tirar de un 'elemento de trabajo' sin bloquearlo.
  • Si el usuario A trabaja el 'elemento de trabajo' enviando el formulario y el usuario B trabaja el mismo 'elemento de trabajo', entonces el trabajo del usuario A entrará en vigencia en la base de datos y se informará al usuario B de que sus cambios no afectar porque otro usuario ha modificado el 'elemento de trabajo'.

Personalmente me gusta la opción 2. Pensamientos por favor?

Respuesta

6

Parece que estás hablando de pessimistic versos optimistic control de concurrencia.

Ambos son ampliamente utilizados, personalmente encuentro que la concurrencia optimista es más fácil de manejar, pero dependerá de sus propios requisitos y uso. Si las ediciones (y los conflictos potenciales) son comunes, entonces el control de concurrencia pesimista puede ser apropiado, de lo contrario, la concurrencia optimista será más rápida y más sencilla de trabajar.

Avisadme si desea ver ejemplos de código utilizando RowVersion tipo de datos en SQL Server (que es lo que estoy usando actualmente), es bastante sencillo, aunque:

  • Todas las tablas incluyen la columna rowversion
  • Todos Las consultas SELECT incluyen esta columna (para los datos que se pueden modificar)
  • Todas las consultas UPDATE o DELETE incluyen WHERE RowVersion = @RowVersion. Esta es la parte optimista, si se devuelven 0 filas y luego alguien más ha tocado la fila, no hay actualizaciones, así que cuéntale al usuario al respecto. NOTA: Si se actualizó la fila, también se debe devolver el nuevo valor para RowVersion. Esto también se aplica a las consultas INSERT, al igual que devolvería el Id de una columna de identidad después de una inserción.
+0

gracias, ¿sabe lo que utilizan la mayoría de los sistemas de seguimiento de errores? pesimista u optimista, asumiría lo último – ckarbass

+0

Disculpe, no sé, pero supongo que como la mayoría de los sistemas de seguimiento de errores están basados ​​en la web, y la web (en su mayoría :) no tiene estado, entonces probablemente se use el bloqueo optimista. – si618

-1

Yo personalmente iría con la opción 2 - más, si corresponde (por ejemplo, esas ediciones son en un texto más largo), es responsabilidad del usuario B fusionar las ediciones. Dale a B una herramienta para hacerlo.

+0

pregunta actualizada, la fusión no es necesaria en este escenario, aunque la retroalimentación es válida – ckarbass

0

No estoy seguro de cómo describir la forma en términos simples, pero no es una página comunitaria , es una cosa de una vez. Hipotéticamente, digamos que el usuario tenía para que coincida con el nombre John DOEE a uno de el siguiente John Doe Jon Do Una vez ha funcionado, la edición está completa. En nuestro caso, no sería necesario que la mera

Teniendo en cuenta que el comentario, me gustaría ir con la opción 1. Teniendo en cuenta que estos cambios son un cambio de horario, no hay ningún beneficio de permitir que varias personas trabajen en el mismo cambio. Solo estás perdiendo el tiempo de la segunda persona.

+0

no estoy seguro de si esto está claro en la pregunta, pero ¿qué sucede si soy un administrador y levanto un elemento de trabajo (formalmente llamado editar) y ahora está bloqueado, entonces usted va a trabajar su cola y no puede trabajar eso elemento porque su administrador lo tiene abierto en un navegador – ckarbass

+0

Yo distingo entre tirar del elemento para editarlo y levantarlo para verlo. Es bastante simple tener un botón de edición que usa JSON al hacer clic en EDITAR para decidir si debe hacer que los campos sean editables o no. – Brian

+0

Ese botón puede ir un paso más allá y, si no se pueden editar, muestra los cambios mediante magia negra (sin volver a cargar la página). Aunque este tipo de cosas se agrega a la complejidad. – Brian

Cuestiones relacionadas