2010-03-29 19 views
7

Tengo un problema que no estoy seguro de cuál es la mejor solución.Operaciones de SQL asíncronas

Tengo una aplicación que actualiza una base de datos en respuesta a solicitudes ad hoc. Una solicitud en particular es bastante común. La solicitud es una actualización que, por sí sola, es bastante simple, pero tiene algunas condiciones previas complejas.

  • para esta solicitud la capa de negocio primeras solicitudes un conjunto de datos de la capa de datos .
  • La capa de lógica de negocio evaluó los datos de la base de datos y parámetros de la petición, desde esta la acción a realizar se determina , y el mensaje la respuesta de la solicitud (s) se crean.
  • La capa empresarial ahora ejecuta el comando de actualización real que es el propósito de la solicitud .

Este último paso es el problema, este comando depende del estado de la base de datos, que puede haber cambiado desde que se ejecutó la lógica comercial. Bloquear los datos leídos en esta operación en varios viajes de ida y vuelta a la base de datos tampoco parece una buena idea. ¿Hay alguna forma de "mejores prácticas" para lograr algo como esto? Gracias!

Respuesta

2

En términos simples, cuando ejecuta el comando de actualización, ¿le preocupa que la base de datos haya cambiado?

Luego llame a los procedimientos almacenados que están escritos a la defensiva y solo se actualizarán si los datos están en un estado aceptable cuando son llamados (verificando las referencias de clave externa, integridad de datos, etc.).

Avísame si puedo ayudarte a burlarme de algún aspecto de esto.

+0

Sí, pero esto pone la lógica empresarial (que me gustaría poder cambiar fácilmente) en un procedimiento almacenado. – Paul

+1

@Paul, no si el proceso almacenado solo está comprobando para validar que los datos no han cambiado. Yo diría que si todo lo que está haciendo en el BL es verificar las condiciones para determinar la tabla/columnas correctas para actualizar, eso debería estar en un proceso almacenado de todos modos. – AllenG

+0

Comprobar que la integridad referencial y las claves foráneas estarán bien es la mejor práctica, tener el db soporte implícito de lógica de negocios a través de estructura y metadatos (en lugar de explícitamente a través de código de procedimiento artificial) también es una buena práctica. – amelvin

2

Puede almacenar el estado original de los objetos comerciales modificados y comparar los objetos originales con sus homólogos de la base de datos para verificar si se ha cambiado algo.

Si se han realizado cambios, puede optar por fusionar los objetos en función de los objetos originales, modificados y almacenados (base de datos) o cancelar la actualización y decirle al cliente que la actualización ha fallado.

+1

Aquí hay algunas palabras clave de Google: la estrategia descrita anteriormente también se llama 'control de concurrencia optimista', en sus encarnaciones más sofisticadas, también hablamos de 'coreografía', 'gestión de procesos comerciales' y 'transacciones compensatorias', ver también 'sagas' . La alternativa es bloquear los datos (base de datos completa, o solo lo que tocó/vio, bloqueo total o bloqueo de solo escritura) cuando comienza la transacción y todos esperan hasta que se complete la operación: esto es lo básico de 'pesimista' control de concurrencia'. – ddimitrov

0

esto es un poco difícil, porque no hay muchos detalles en la pregunta, así que solo daré un ejemplo simple que pueda aplicar a su situación.

cargar todos los datos, así como la fecha de última modificación (aaaa-mm-dd hh: mi: SS.mmm)

SELECT AAA,BBB,LastChgDate FROM YourTable WHERE ID=xxxxxx 

hacen su lógica de negocio

guardar los datos

UPDATE YourTable SET AAA=aaaaa,BBB=bbbbb WHERE ID=xxxxxx AND LastChgDate=zzzzzz 

Si el recuento de filas! = 1 significa que alguien más ha cambiado los datos; de lo contrario, los datos se guardan.

+0

Este * patrón * se llama control de concurrencia optimista: http://en.wikipedia.org/wiki/Control_conciudad_ptimista –

0

Utilice un modo de aislamiento de transacción adecuado y haga todo en una transacción de base de datos única (es decir, inicie la transacción en el paso 1. y realice la confirmación después del paso 3.).

Su pregunta es un poco vaga, pero creo que o necesita el modo SNAPSHOT o LEA COMPROMETIDO.

Cuestiones relacionadas