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.
Respuesta Responder a este mensaje
#2 Anonimo
13/04/2005 - 08:33 | Informe spam
Utilizo SqlServer, pero la cuestión es el planteamiento
de la concurrencia, creo.


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.


.

Respuesta Responder a este mensaje
#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.


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.


.

Respuesta Responder a este mensaje
#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.
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.


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.


.





.

Respuesta Responder a este mensaje
#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.
Tratar el tema de la concurrencia es siempre un dilema, y


hay muchas formas
de hacerlo, mi teorà­a es que el àºltima que llega es lo


que se queda en la
BBDD. Una forma de tratarla es creando un DataAdapter que


te detecta si
alguién ha modificado los datos antes que otro al hacer


los cambios en la
BBDD, esto te producirà¡ un error que puedes manejar a tu


antojo, es decir, si
quieres recargar los datos modificados, si machacarlos,


etc.
En cuanto a refrescar los datos tras las modificaciones


el DataAdapter tiene
una opción de recargar los datos una vez hecha las


actualizaciones.

En cuanto a las transacción no deberà­as abrir una


transacción al cargar un
formulario y cerrarla o deshacerla al finalizar, ya que


mientras tienes una
transacción habierta està¡s bloqueando los registros o


tablas que està¡s
modificando, lo que provoca que otros usuarios no puedan


acceder a esos
registros hasta que tu no termines tu transacción, lo


que te darà¡ unos pocos
quebraderos de cabeza. Las transacciones deben ser lo


mà¡s rà¡pidas posibles y
deben bloquear lo mà­nimo. Lo que te hace una transacción


es asegurarte que no
ocurra un desastre mientras modificas los datos de las


tablas y deje
inconsistencias en la BBDD.

Espero haberte sido de ayuda,

dIEGO cAMPOS
saludos.
"" escribió:


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.
>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.
>
>
>>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.
>>
>>
>>.
>>
>
>
>.
>



.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida