Transacciones entre ensamblados

16/01/2009 - 13:44 por Guillermo Peralta | Informe spam
Buen día.. se me presenta el siguiente caso

En un ensamblado por ejemplo Datos1 tengo un metodo para guardar registros
en la BD
En otro ensablado Datos2 tengo otro metodo para guardar otros registros.

En ambos casos cada clase se encarga de abrir y cerrar la conexion con la BD

Desde la aplicación tengo referenciado a ambos ensamblados y si llamo a cada
uno por separado no hay problema, pero necesito que los dos formen parte de
una misma operacion, es decir necesito realizar una transacción.

La pregunta es si este es el caso para utilizar transacciones distribuidas o
si se puede resolver de otra manera, el problema que tengo es que cada clase
abre y cierra una conexion.. aunque a lo mejor me estoy perdiendo de algo..

Gracias..



Guillermo Peralta

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
16/01/2009 - 17:01 | Informe spam
"Guillermo Peralta" @SPAM.com.ar> wrote in message
news:
Buen día.. se me presenta el siguiente caso

En un ensamblado por ejemplo Datos1 tengo un metodo para guardar registros
en la BD
En otro ensablado Datos2 tengo otro metodo para guardar otros registros.

En ambos casos cada clase se encarga de abrir y cerrar la conexion con la
BD

Desde la aplicación tengo referenciado a ambos ensamblados y si llamo a
cada uno por separado no hay problema, pero necesito que los dos formen
parte de una misma operacion, es decir necesito realizar una transacción.

La pregunta es si este es el caso para utilizar transacciones distribuidas
o si se puede resolver de otra manera, el problema que tengo es que cada
clase abre y cierra una conexion.. aunque a lo mejor me estoy perdiendo de
algo..



Si las dos transacciones se realizan sobre el mismo servidor sql, es
preferible que hagas una transacción local que es mucho más eficiente que
una transacción distribuida, ya que así te evitas tener que utilizar el DTC
y que se haga un Commit en dos fases.

Para ello puedes usar un SqlTransaction (que sólo funciona si las dos
operaciones utilizan la misma conexión), o usar un objeto TransactionScope
que es muy listo y te realiza una transacción local si las dos conexiones
van a parar al mismo servidor, y automáticamente te la escala a transacción
distribuída en caso de que no se pueda hacer local.
Respuesta Responder a este mensaje
#2 Guillermo Peralta
16/01/2009 - 20:28 | Informe spam

Para ello puedes usar un SqlTransaction (que sólo funciona si las dos
operaciones utilizan la misma conexión), o usar un objeto TransactionScope
que es muy listo y te realiza una transacción local si las dos conexiones
van a parar al mismo servidor, y automáticamente te la escala a
transacción distribuída en caso de que no se pueda hacer local.



Gracias Alberto, pero no puedo hacer andarlo.. la consulta va hacia el mismo
server.. pero me dice que debo arrancar el MSDTC, me da error..
"Se ha deshabilitado el acceso de red para el administrador de transacciones
distribuidas (MSDTC). Habilite DTC para el acceso de red en la configuración
de seguridad de MSDTC utilizando la herramienta administrativa Servicios de
componentes." en cuanto intento abrir la segunda conexion...

Que podrá ser?
Respuesta Responder a este mensaje
#3 Jesús López
18/01/2009 - 21:01 | Informe spam
Cuando dentro de un TransactionScope se abre más de una conexión, aunque
sean a la misma base de datos, la transacción se promociona a transacción
distribuida. Las transacciones distribuidas son maneejadas por el MSDTC
(Microsoft Distributed Transaction Coordinator). De forma predeterminada el
acceso de red de MSDTC está deshabilidado. Si el cliente que ejecuta la
transacción distribuida no está en la misma máquina que SQL Server, entonces
es necesario acceso de red de MSDTC.

Vamos que el mensaje de error te está diciendo exactamente qué es lo que
está pasando y además te está diciendo como arreglarlo. En el servidor SQL,
ejecutas la herramienta administrativa de Servicios de Componentes, todos
los programas -> herramientas administrativas -> servicios de componentes, o
panel de control->herramientas administrativas->servicios de componentes o
C:\WINDOWS\system32\Com\comexp.msc. Expandes Raíz de la Consola->Servicios
de Componentes->Equipos. Haces click con el botón derecho en Mi PC, eliges
propiedades, te vas a la ficha MSDTC, pulsas el botón "Configuración de
Seguridad" y allí habilitas:

1) Acceso a DTC desde la red
a) permitir clientes remotos
b) permitir entrantes
c) permitir salientes

Saludos:

Jesús López




"Guillermo Peralta" @SPAM.com.ar> escribió en el
mensaje news:%23%


Para ello puedes usar un SqlTransaction (que sólo funciona si las dos
operaciones utilizan la misma conexión), o usar un objeto
TransactionScope que es muy listo y te realiza una transacción local si
las dos conexiones van a parar al mismo servidor, y automáticamente te la
escala a transacción distribuída en caso de que no se pueda hacer local.



Gracias Alberto, pero no puedo hacer andarlo.. la consulta va hacia el
mismo server.. pero me dice que debo arrancar el MSDTC, me da error..
"Se ha deshabilitado el acceso de red para el administrador de
transacciones
distribuidas (MSDTC). Habilite DTC para el acceso de red en la
configuración
de seguridad de MSDTC utilizando la herramienta administrativa Servicios
de
componentes." en cuanto intento abrir la segunda conexion...

Que podrá ser?


Respuesta Responder a este mensaje
#4 Guillermo Peralta
19/01/2009 - 12:49 | Informe spam
Hola Jesús.. gracias por responder.. de hecho ya habia realizado esa
configuración que comentas...

He continuado con las pruebas y he visto que el problema se me produce sólo
en el entorno de desarrollo. Subi el sitio al IIS del servidor y funciona
correctamente

La excepcion que se produce ahora es: "Error de comunicación con el
administrador de transacciones subyacente"

Definitivamente algo más me falta configurar en algun lado pero aun no logro
encontrar por donde..

Guillermo Peralta


"Jesús López" escribió en el
mensaje de noticias:
Cuando dentro de un TransactionScope se abre más de una conexión, aunque
sean a la misma base de datos, la transacción se promociona a transacción
distribuida. Las transacciones distribuidas son maneejadas por el MSDTC
(Microsoft Distributed Transaction Coordinator). De forma predeterminada
el
acceso de red de MSDTC está deshabilidado. Si el cliente que ejecuta la
transacción distribuida no está en la misma máquina que SQL Server,
entonces
es necesario acceso de red de MSDTC.

Vamos que el mensaje de error te está diciendo exactamente qué es lo que
está pasando y además te está diciendo como arreglarlo. En el servidor
SQL,
ejecutas la herramienta administrativa de Servicios de Componentes, todos
los programas -> herramientas administrativas -> servicios de componentes,
o
panel de control->herramientas administrativas->servicios de componentes o
C:\WINDOWS\system32\Com\comexp.msc. Expandes Raíz de la Consola->Servicios
de Componentes->Equipos. Haces click con el botón derecho en Mi PC, eliges
propiedades, te vas a la ficha MSDTC, pulsas el botón "Configuración de
Seguridad" y allí habilitas:

1) Acceso a DTC desde la red
a) permitir clientes remotos
b) permitir entrantes
c) permitir salientes

Saludos:

Jesús López




"Guillermo Peralta" @SPAM.com.ar> escribió en el
mensaje news:%23%


Para ello puedes usar un SqlTransaction (que sólo funciona si las dos
operaciones utilizan la misma conexión), o usar un objeto
TransactionScope que es muy listo y te realiza una transacción local si
las dos conexiones van a parar al mismo servidor, y automáticamente te
la
escala a transacción distribuída en caso de que no se pueda hacer local.



Gracias Alberto, pero no puedo hacer andarlo.. la consulta va hacia el
mismo server.. pero me dice que debo arrancar el MSDTC, me da error..
"Se ha deshabilitado el acceso de red para el administrador de
transacciones
distribuidas (MSDTC). Habilite DTC para el acceso de red en la
configuración
de seguridad de MSDTC utilizando la herramienta administrativa Servicios
de
componentes." en cuanto intento abrir la segunda conexion...

Que podrá ser?








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