Concurrencia en App WinForms

16/02/2005 - 21:17 por Gabriel Zato | Informe spam
Hola, tengo un problema que me está volviendo turuleta.

Existe una aplicación WinForms creada con VS.NET 2003,
framework 1.1, en Windows XP.
El ejecutable .EXE - y toda la instalación, dlls, etc-
está en una unidad de red, T:\ por ejemplo. Dicha
aplicación .NET(EXE) es "ejecutada" por varios usuarios de
la red, con Windows XP.

Bien, en determinadas ocasiones se producen errores
inesperados, por ej, cuando un usuario edita un registro y
otro usuario edita otro registro (no el mismo registro).

La aplicación tiene un form con un filtro y un datagrid
que se carga de datos. Al pulsar sobre fila de datagrid se
abre un form2 con una serie de tabs, y botones aceptar y
cancelar.

Bien, en el Load de form2 se inicia transacción
(begintransaction), y al aceptar-cancelar se haría commit
o rollback. En el Close de form2 también se controla para
hacer commit o rollback.

Qué puede estar pasando ?. Influye el hecho que el EXE
esté en una unidad de red y los usuarios ejecuten el mismo
EXE ?


Cómo puedo solucionar la problemática de la concurrencia
en estos casos:

- Un usuario pulsa sobre la fila 1 de la rejilla; otro
usuario pulsa sobre la fila 1 de la rejilla. Qué se puede
hacer ?

- Un usuario pulsa sobre la fila 1 de la rejilla; otro
usuario pulsa sobre la fila 10 de la rejilla; habría algún
problema de concurrencia y acceso a datos en este caso ?.

En fin, que estoy hecho un lío :-)
 

Leer las respuestas

#1 A.Poblacion
16/02/2005 - 22:03 | Informe spam
Probablemente tengas un problema de bloqueos sobre la base de datos. Cuando
haces el BeginTransaction, la base de datos va bloqueando todas las partes a
las que accedes, y según la base de datos de que se trate, pueden ser
bloqueos de registro, de página, o de tabla. Algunas como Sql Server escalan
automáticamente los bloqueos (es decir, cuando tiene varios registros
bloqueados pasa a bloquear la página completa, y cuando tiene varias páginas
bloqueadas pasa a bloquear la tabla completa). Si otro usuario accede al
mismo registro, o página, o tabla, se queda el programa parado esperando a
que se libere el bloqueo, y si al cabo de determinado timeout no se ha
liberado, pues se produce un error. Los bloqueos no se liberan hasta que
haces el commit o el rollback.

¿Qué hay que hacer para evitar estos bloqueos? Pues lo más importante es
diseñar los programas de forma que nunca medie una intervención del usuario
entre un BeginTransaction y su correspondiente Commit o RollBack, para que
los bloqueos nunca permanezcan activos mientras el usuario interactúa con el
programa. En otras palabras, hay que usar los mecanismos denominados "de
concurrecia optimista", en lugar de los que estás usando, de tipo
"pesimista", cuando entre medias se espera una intervención del usuario.

El hecho de que el exe se comparta en red no tiene nada que ver. Te
ocurrirán los mismos errores aunque instales una copia del exe en cada
puesto.


"Gabriel Zato" wrote in message
news:125f01c51464$9195b5c0$
Hola, tengo un problema que me está volviendo turuleta.

Existe una aplicación WinForms creada con VS.NET 2003,
framework 1.1, en Windows XP.
El ejecutable .EXE - y toda la instalación, dlls, etc-
está en una unidad de red, T:\ por ejemplo. Dicha
aplicación .NET(EXE) es "ejecutada" por varios usuarios de
la red, con Windows XP.

Bien, en determinadas ocasiones se producen errores
inesperados, por ej, cuando un usuario edita un registro y
otro usuario edita otro registro (no el mismo registro).

La aplicación tiene un form con un filtro y un datagrid
que se carga de datos. Al pulsar sobre fila de datagrid se
abre un form2 con una serie de tabs, y botones aceptar y
cancelar.

Bien, en el Load de form2 se inicia transacción
(begintransaction), y al aceptar-cancelar se haría commit
o rollback. En el Close de form2 también se controla para
hacer commit o rollback.

Qué puede estar pasando ?. Influye el hecho que el EXE
esté en una unidad de red y los usuarios ejecuten el mismo
EXE ?


Cómo puedo solucionar la problemática de la concurrencia
en estos casos:

- Un usuario pulsa sobre la fila 1 de la rejilla; otro
usuario pulsa sobre la fila 1 de la rejilla. Qué se puede
hacer ?

- Un usuario pulsa sobre la fila 1 de la rejilla; otro
usuario pulsa sobre la fila 10 de la rejilla; habría algún
problema de concurrencia y acceso a datos en este caso ?.

En fin, que estoy hecho un lío :-)

Preguntas similares