Concurrencia en WinForms

12/04/2005 - 20:20 por Gabriel Zato Cearra | 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 ?.
Según creo, que esté en unidad de red, no afectaría, pues
es cuestión permisos de seguridad.

Intuyo que es por transacciones, y se hace algo de eso de
una política "pesimista" en lugar de "optimista". Pero en
mi caso, cómo puedo hacerla optimista si no tengo un
Dataset, con el que hacer el UpdateChanges a traveŽs de un
DataAdapter ?????


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

- Un usuario pulsa sobre la fila 1 de la rejilla para
editar esa fila en otro Form; otro
usuario pulsa sobre la fila 1 de la rejilla para editar
esa fila en otro Form. Qué se puede
hacer ?

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

Nota: en ambos casos, no hay un DataSet (no hay nada
desconectado), la rejilla se carga y se refresca cada vez
que se modifican los datos de la fila X.

En fin, que estoy hecho un lío y no voy a acabar muy bien.

Preguntas similare

Leer las respuestas

#1 Miguel Angel Campos
12/04/2005 - 21:47 | Informe spam
Que base de datos estás utilizando?
Un Saludo,

Miguel Angel Campos
MCAD.NET

"Gabriel Zato Cearra" escribió en el
mensaje news:0b4e01c53f8c$41cccf80$
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 ?.
Según creo, que esté en unidad de red, no afectaría, pues
es cuestión permisos de seguridad.

Intuyo que es por transacciones, y se hace algo de eso de
una política "pesimista" en lugar de "optimista". Pero en
mi caso, cómo puedo hacerla optimista si no tengo un
Dataset, con el que hacer el UpdateChanges a trave´s de un
DataAdapter ?????


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

- Un usuario pulsa sobre la fila 1 de la rejilla para
editar esa fila en otro Form; otro
usuario pulsa sobre la fila 1 de la rejilla para editar
esa fila en otro Form. Qué se puede
hacer ?

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

Nota: en ambos casos, no hay un DataSet (no hay nada
desconectado), la rejilla se carga y se refresca cada vez
que se modifican los datos de la fila X.

En fin, que estoy hecho un lío y no voy a acabar muy bien.
#2 Anonimo
13/04/2005 - 08:33 | Informe spam
Utilizo SqlServer, pero la cuestión es el planteamiento
de la concurrencia, creo.


Mostrar la cita
escribió en el
Mostrar la cita
de
Mostrar la cita
y
Mostrar la cita
se
Mostrar la cita
mismo
Mostrar la cita
un
Mostrar la cita
caso ?.
Mostrar la cita
bien.
Mostrar la cita
#3 Miguel Angel Campos
13/04/2005 - 09:05 | Informe spam
Te comento varios puntos:
- No deberías iniciar una transacción en el Load del Form, ni terminarla en
el Close. Deberias hacerlo en el Aceptar del Form, y si se produce un error
en la actualización, y siempre que sea una actualización compleja (varias
tablas implicadas), realizas un Roolback. No tiene sentido que inicies
transacción sin saber si vas a realizar algo o no, ten en cuenta que consume
muchos recursos del servidor.
- Si no utilizas un Dataset es por que utilizas un DataReader, y mi pregunta
es, dejas abierto el datareader durante todo el tiempo. El DataReader
permite realizar lecturas de información más rápido desde la base de datos,
pero tambien se apropia en exclusiva de la conexión a la base de datos que
utiliza.
- Otro tema que te aseguro, tal y como tu ya intuias, es que no hay problema
por que ejecutes la aplicación en un recurso compartido.
Un Saludo,

Miguel Angel Campos
MCAD.NET

escribió en el mensaje
news:09c101c53ff2$a3cffe80$

Utilizo SqlServer, pero la cuestión es el planteamiento
de la concurrencia, creo.


Mostrar la cita
escribió en el
Mostrar la cita
de
Mostrar la cita
y
Mostrar la cita
se
Mostrar la cita
mismo
Mostrar la cita
un
Mostrar la cita
caso ?.
Mostrar la cita
bien.
Mostrar la cita
#4 Anonimo
13/04/2005 - 16:07 | Informe spam
No dejo DataReader abierto, utilizo un Dataset para
cargar la rejilla, pero digamos que Žse refresca la
rejilla cada vez que modifico los datos asociados a la
fila.

Por ejemplo, pulso sobre una fila de la rejilla y hago
ShowDialog de un Formulario nuevo que tiene varios tabs.

Bien, en el Load inicio transacción -seguramente mal
hecho-.
En cada pestaña Tab, si se modifican datos, se realizan
updates, o también insert o deletes en algún caso.

En el formulario, hay dos botones que afectan a todos los
Tabs. Uno es ACeptar que haría commit, y un botón
Cancelar para Rollback.

A su vez, en Close del formulario, también se haría
Rollback, si el usuario diese a la aspa X de la ventanita.


Seguramente este planteamiento es pésimo, por eso
quisiera encontrar solución aceptable.

Gracias.
Mostrar la cita
Form, ni terminarla en
Mostrar la cita
se produce un error
Mostrar la cita
compleja (varias
Mostrar la cita
sentido que inicies
Mostrar la cita
en cuenta que consume
Mostrar la cita
DataReader, y mi pregunta
Mostrar la cita
El DataReader
Mostrar la cita
desde la base de datos,
Mostrar la cita
base de datos que
Mostrar la cita
que no hay problema
Mostrar la cita
mensaje
Mostrar la cita
commit
Mostrar la cita
para
Mostrar la cita
pues
Mostrar la cita
de
Mostrar la cita
en
Mostrar la cita
vez
Mostrar la cita
#5 Anonimo
13/04/2005 - 20:29 | Informe spam
Hola, graciaspor los comentarios, me están aclarando poco
a poco.

Entonces, al iniciar una transacción se bloquea toda sobre
la que hacemos consultas select e IUD ? o solo los
registros afectados ?

Lo que está claro que el enfoque transaccional en Load y
Close de un Form es pésimo.

Sólo me queda estructurar mejor los formularios, o pensar
una forma de hacerlo, en el caso de tener varios Tabs en
un form.

La otra cuestión que me sigue quedando confusa en la
gestión de la concurrencia; quizá tenga que utilizar el
DataAdapter y tener Dataset desconectado en lugar de hacer
IUD directamente sobre BBDD.

En el modo desconectado me preocupa el rendimiento, pues
meimagino que en un Dataset cargo muchos registros a
partir de una consulta, no sé qué paŽsaría entonces.

Saludos y gracias.
Mostrar la cita
hay muchas formas
Mostrar la cita
que se queda en la
Mostrar la cita
te detecta si
Mostrar la cita
los cambios en la
Mostrar la cita
antojo, es decir, si
Mostrar la cita
etc.
Mostrar la cita
el DataAdapter tiene
Mostrar la cita
actualizaciones.
Mostrar la cita
transacción al cargar un
Mostrar la cita
mientras tienes una
Mostrar la cita
tablas que està¡s
Mostrar la cita
acceder a esos
Mostrar la cita
que te darà¡ unos pocos
Mostrar la cita
mà¡s rà¡pidas posibles y
Mostrar la cita
es asegurarte que no
Mostrar la cita
tablas y deje
Mostrar la cita
realizan
Mostrar la cita
los
Mostrar la cita
ventanita.
Mostrar la cita
si
Mostrar la cita
actualización
Mostrar la cita
ten
Mostrar la cita
tiempo.
Mostrar la cita
la
Mostrar la cita
es
Mostrar la cita
compartido.
Mostrar la cita
planteamiento
Mostrar la cita
turuleta.
Mostrar la cita
2003,
Mostrar la cita
etc-
Mostrar la cita
usuarios
Mostrar la cita
registro
Mostrar la cita
registro).
Mostrar la cita
datagrid
Mostrar la cita
datagrid
Mostrar la cita
aceptar y
Mostrar la cita
EXE
Mostrar la cita
a,
Mostrar la cita
eso
Mostrar la cita
Pero
Mostrar la cita
de
Mostrar la cita
concurrencia
Mostrar la cita
editar
Mostrar la cita
editar
Mostrar la cita
Ads by Google
Search Busqueda sugerida