2011-01-13 11 views
8

Hace un tiempo, escribí una aplicación utilizada por varios usuarios para manejar la creación de intercambios. No he hecho desarrollo desde hace algún tiempo, y no recuerdo cómo administré la concurrencia entre los usuarios. Por lo tanto, estoy buscando algunos consejos en términos de diseño.¿Cuál es la mejor manera de administrar la concurrencia en una aplicación de acceso a la base de datos?

La aplicación original tenía las siguientes características:

  • Un cliente pesado por el usuario.
  • Una única base de datos.
  • Acceso a la base de datos para que cada usuario inserte/actualice/elimine intercambios.
  • Una cuadrícula en la aplicación que refleja la tabla de intercambios. Esa grilla se actualiza cada vez que alguien cambia un trato.
  • Estoy usando WPF.

Aquí es lo que estoy preguntando:

  1. Estoy en lo correcto al pensar que no deben preocuparse por la conexión a la base de datos para cada aplicación? Teniendo en cuenta que hay un singleton en cada uno, esperaría una conexión por cliente sin problemas.

  2. ¿Cómo puedo evitar la concurrencia de los accesos? Creo que debería bloquear cuando modifique los datos, sin embargo, no recuerdo cómo hacerlo.

  3. ¿Cómo configuro la red para que se actualice automáticamente siempre que mi base de datos se actualice (por otro usuario, por ejemplo)?

Gracias de antemano por su ayuda!

+3

Lo tipo de base de datos? –

+0

¿Qué estás usando como interfaz de usuario? ASP.NET? WinForms? WPF? Silverlight? – Jeff

+0

Estoy usando WPF. Lo agregué en la descripción. gracias – Goul

Respuesta

2
  1. Considere la posibilidad de aprovechar Connection Pooling para reducir el número de conexiones. Consulte: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  2. bloquee lo más tarde posible y suéltelo lo antes posible para maximizar la simultaneidad. Puede usar TransactionScope (consulte: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx y http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx) si tiene varias acciones de base de datos que deben combinarse para administrar la coherencia o simplemente manejarlas en el proceso almacenado de base de datos. Mantenga su consulta simple. Siga los siguientes consejos para entender cómo bloquear el trabajo y la forma de reducir la contención de recursos y el punto muerto: http://www.devx.com/gethelpon/10MinuteSolution/16488

  3. No estoy seguro de otra db, pero para SQL, puede utilizar la dependencia de SQL, consulte http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

+0

Gracias por la respuesta Jimmy! Me arrojó algunas luces sobre todas mis preguntas, gracias por los artículos. – Goul

3

Concurrencia es generalmente otorgada por el DBMS usando bloqueos. Los bloqueos son un tipo de semáforo que otorga el bloqueo exclusivo a un recurso determinado y permite restringir o poner en cola otros accesos (solo restringido en el caso de que utilice lecturas sin compromiso).

El número de conexiones en sí mismo no representa un problema mientras no esté llegando a alturas donde puede tocar la configuración max_connections de su DBMS. De lo contrario, podría tener un problema al conectarse con fines de mantenimiento o para apagarlo.

Los DBMS suelen utilizar un concepto de bloqueos de tabla (MyISAM) o bloqueos de fila (InnoDB, la mayoría de los demás DBMS). El tipo de bloqueo determina el volumen del bloqueo. Los bloqueos de tabla pueden ser muy rápidos, pero generalmente se consideran inferiores a los bloqueos de nivel de fila.

Los bloqueos de nivel de fila se producen dentro de una transacción (implícita o explícita). Al iniciar una transacción manualmente, comienza su alcance de transacción. Hasta que cierre manualmente el alcance de la transacción, todos los cambios que realice serán atributos de esta transacción exacta. Los cambios que realice también obedecerán al ACID paradigm.

El alcance de la transacción y cómo usarlo es un tema demasiado largo para esta plataforma, si lo desea, puedo publicar algunos enlaces que lleven más información sobre este tema.

Para las actualizaciones automáticas, la mayoría de las bases de datos admiten algún tipo de mecanismo de activación, que es un código que se ejecuta en acciones específicas en la base de datos (por ejemplo, la creación de un nuevo registro o el cambio de un registro).Podría publicar su código dentro de este disparador. Sin embargo, solo debe informar a una aplicación receptora de los cambios, no realmente "hacer" los cambios desde el desencadenador, incluso si el lenguaje lo hace posible. Recuerde que la acción que activó el código se suspende hasta que finalice con su código de activación. Esto significa que un gatillo magro es el mejor, si es necesario.

+0

Gracias por su ayuda TME, es muy instructivo y me responde bien los mecanismos de concurrencia. Cheers – Goul

Cuestiones relacionadas