Error de Transacción con COM+

22/02/2006 - 20:22 por AOG | Informe spam
Hola tengo el siguiente problema:
Tengo un solucion en la que utilizo EnterpriseServices entre otras cosas
para la gestión de transacciones en la capa de negocio hacia el acceso a
datos, este proyecto puede gestionar indistintamente una base de datos MS Sql
Server o MySQL (me he implementado un interfaz en el acceso a datos) , hago
esta puntualización porque cuando le digo al proyecto que utilize la base de
datos MySql no hay problemas. Cuando el proyecto ataca al la base de datos MS
SQLServer me da el siguiente error:

{"La transacción ya se ha llevado a cabo o se ha cancelado implícita o
explícitamente (Exception from HRESULT: 0x8004D00E)"}

El componente funciona de la siguiente forma:

Componente A --> Componente B --> Acceso a Base de datos.

Según he leido lo que puede pasar es que el componente B
realice un Abort y el componente A un Commit. El problema
es que el componente B no realiza Abort ni Commit en
ningún lado (tiene "Supported", tampoco tiene AutoComplete
()), es decir el que se encargada de hacer eso es el
Componente A (que tiene "Requires", también he probado Requires New).

Tambien probé deshabilitando las transacciones, es decir, ejecutar las COM
sin transaccionalidad y me funcionó bien. Esto lo hice para despejar
cualquier duda sobre problemas de conexión entre las maquinas y de red,
además, los dos servidores de SQL (Mysql y MS Sql) está en la misma máquina,
si tengo que decir que mi máquina de desarrollo no es la misma, es decir,
tengo el proyecto en un PC distindo en donde se aloja los Servidores SQL. Es
más cuando se inicia la aplicación pide usuario y conecta con la BBDD sin
problemas, claro, porque ahí no utilizo nada de transacciones ni componentes
COM+, pero cuando utilizo por ejemplo cualquier mantenimiento me salta el
error.
Bueno, no he dicho cuando se proboca el error, y es cuando ejecuto la
instrucción
MyConexion.Open(), a intentar abrir la conexión, hago llamada al componete
de negocio de MoverRegistroSiguiente, este llama a la capa de acceso a datos
MoverRegistroSiguiente en la cual llama al interfaz para abrir conexión y me
da el error.
En la cabecera de la clase de la capa de negocio tiene puesto:
<EnterpriseServices.ObjectPooling(minPoolSize:=INT_Pooling_MIM_PoolSize,
maxPoolSize:=INT_Pooling_MAX_PoolSize,
CreationTimeout:=INT_Pooling_CreationTimeout)> _
<EnterpriseServices.JustInTimeActivation()> _
<System.EnterpriseServices.TransactionAttribute( _
System.EnterpriseServices.TransactionOption.Required)> _
Public Class MantemimientoCN
'// He probado con <AutoComplete()> y sin <AutoComplete()> y da error
'<AutoComplete()> _
Public Function MoverRegistroSiguiente(Byval dt as DataSet) as
DataSet
Return oMateAD.MoverRegistroSiguiente(dt)
End Function
End Class
Bueno espero que con esta información, me puedas ayudar a solucionar este
problema.

Un saludo.

Preguntas similare

Leer las respuestas

#1 Rodrigo Díaz
23/02/2006 - 04:48 | Informe spam
Hola yo tengo una pregunta:

¿Y otras transacciones de tus componentes funcionan correctamente?

Por otro lado veo que estas pidiendo como parámetro un DataSet, lo cuál no
es nada recomendable ya que eso impacta directamente con el performance de
tus componentes y obviamente también en el performance en el que ejecuta la
transacción.



"AOG" wrote:

Hola tengo el siguiente problema:
Tengo un solucion en la que utilizo EnterpriseServices entre otras cosas
para la gestión de transacciones en la capa de negocio hacia el acceso a
datos, este proyecto puede gestionar indistintamente una base de datos MS Sql
Server o MySQL (me he implementado un interfaz en el acceso a datos) , hago
esta puntualización porque cuando le digo al proyecto que utilize la base de
datos MySql no hay problemas. Cuando el proyecto ataca al la base de datos MS
SQLServer me da el siguiente error:

{"La transacción ya se ha llevado a cabo o se ha cancelado implícita o
explícitamente (Exception from HRESULT: 0x8004D00E)"}

El componente funciona de la siguiente forma:

Componente A --> Componente B --> Acceso a Base de datos.

Según he leido lo que puede pasar es que el componente B
realice un Abort y el componente A un Commit. El problema
es que el componente B no realiza Abort ni Commit en
ningún lado (tiene "Supported", tampoco tiene AutoComplete
()), es decir el que se encargada de hacer eso es el
Componente A (que tiene "Requires", también he probado Requires New).

Tambien probé deshabilitando las transacciones, es decir, ejecutar las COM
sin transaccionalidad y me funcionó bien. Esto lo hice para despejar
cualquier duda sobre problemas de conexión entre las maquinas y de red,
además, los dos servidores de SQL (Mysql y MS Sql) está en la misma máquina,
si tengo que decir que mi máquina de desarrollo no es la misma, es decir,
tengo el proyecto en un PC distindo en donde se aloja los Servidores SQL. Es
más cuando se inicia la aplicación pide usuario y conecta con la BBDD sin
problemas, claro, porque ahí no utilizo nada de transacciones ni componentes
COM+, pero cuando utilizo por ejemplo cualquier mantenimiento me salta el
error.
Bueno, no he dicho cuando se proboca el error, y es cuando ejecuto la
instrucción
MyConexion.Open(), a intentar abrir la conexión, hago llamada al componete
de negocio de MoverRegistroSiguiente, este llama a la capa de acceso a datos
MoverRegistroSiguiente en la cual llama al interfaz para abrir conexión y me
da el error.
En la cabecera de la clase de la capa de negocio tiene puesto:
<EnterpriseServices.ObjectPooling(minPoolSize:=INT_Pooling_MIM_PoolSize,
maxPoolSize:=INT_Pooling_MAX_PoolSize,
CreationTimeout:=INT_Pooling_CreationTimeout)> _
<EnterpriseServices.JustInTimeActivation()> _
<System.EnterpriseServices.TransactionAttribute( _
System.EnterpriseServices.TransactionOption.Required)> _
Public Class MantemimientoCN
'// He probado con <AutoComplete()> y sin <AutoComplete()> y da error
'<AutoComplete()> _
Public Function MoverRegistroSiguiente(Byval dt as DataSet) as
DataSet
Return oMateAD.MoverRegistroSiguiente(dt)
End Function
End Class
Bueno espero que con esta información, me puedas ayudar a solucionar este
problema.

Un saludo.

Respuesta Responder a este mensaje
#2 AOG
23/02/2006 - 10:29 | Informe spam
Hola Rodrigo, gracias antes de todo.
No, no me funciona en ningún componete, al menos los que he probado, ya que
estoy en fase de desarrollo, y no llevo mucho realizado.

Con respecto al traspaso de un DataSet como parámetro, y perdona mi
ignorancia, no entiendo que es lo que me quieres decir, pero el dataset tan
solo contendrá una fila que es el registro actual que el usuario está
consultando o manipulando de una tabla de la BBDD, no lleva todos los
registros de una tablas. De alguna manera tendré que llevar los datos que ha
manipulado (en el caso de que haya modificado el registro) a la capa de
negocio para guardarlo en la BBDD y en el caso de mover(navegar) sobre los
registro, le paso el dataset (solo una fila) para obtener los datos
necesarios para realizar la consulta de selección para obtener el primero,
siguiente, anterior o último registro, ya que he hecho una clase para el
mantenimiento genérico, es decir, para cualquier tabla y me hace falta saber
como el campo clave, el tipo , etc.
No se si esto de alguna manera interviene en el rendimiento de mi aplicación
y en este caso si afecta de alguan manera a las transacciones.

En otro foros, me han dicho un par de cosas que me está haciendo dudar de
exponer mi clases como componentes COM+, vamos utlizar las librerías
EnterpriseServices, ya que me ha dicho que desactiva todo Object Pooling. El
Object Pooling es muy problemático con objetos transacionales. Y otra cosa es
que
MySql no soporta transacciones manejadas por el MSDTC. Las conexiones MySql
"NO" se enlistan automáticamente en la transacción activa. Es decir, usar
MySql en un objeto transacional COM+ es como usarlo en un objeto no COM+.
Dicho de otra manera, a MySql le importa muy poco si el objeto es
transacional o no.

Además también tengo entendido que exponer las clases como componetes COM+
afecta el rendimiento, va más lento. en el caso de que la aplicación no la
vaya a utlizar más de un número de usuario a la vez (creo que más de 100
usuario no recuerdo) no es "recomendable" utilizar estos servicios, bueno mi
aplicación estimo que por ahí andará el número.
Todo esto me hace pensar de que en mi proyecto no encaja en utilizar
EnterpriseServices. Yo pensaba utilizar, por comodidad, las Transacciones y
resulta de que no me vale 1º porque no funciona cuando la aplicación utiliza
MySQL y 2º estoy teniendo problemas cuando mi proyecto utiliza MS SQLServer.
Tú Rodrigo u otra lector que me aconsejais, ya que es mi primer proyecto de
"gran envergadura" con la plataforma net, ya que procedo de VB5.

Un saludo




"Rodrigo Díaz" escribió:

Hola yo tengo una pregunta:

¿Y otras transacciones de tus componentes funcionan correctamente?

Por otro lado veo que estas pidiendo como parámetro un DataSet, lo cuál no
es nada recomendable ya que eso impacta directamente con el performance de
tus componentes y obviamente también en el performance en el que ejecuta la
transacción.



"AOG" wrote:

> Hola tengo el siguiente problema:
> Tengo un solucion en la que utilizo EnterpriseServices entre otras cosas
> para la gestión de transacciones en la capa de negocio hacia el acceso a
> datos, este proyecto puede gestionar indistintamente una base de datos MS Sql
> Server o MySQL (me he implementado un interfaz en el acceso a datos) , hago
> esta puntualización porque cuando le digo al proyecto que utilize la base de
> datos MySql no hay problemas. Cuando el proyecto ataca al la base de datos MS
> SQLServer me da el siguiente error:
>
> {"La transacción ya se ha llevado a cabo o se ha cancelado implícita o
> explícitamente (Exception from HRESULT: 0x8004D00E)"}
>
> El componente funciona de la siguiente forma:
>
> Componente A --> Componente B --> Acceso a Base de datos.
>
> Según he leido lo que puede pasar es que el componente B
> realice un Abort y el componente A un Commit. El problema
> es que el componente B no realiza Abort ni Commit en
> ningún lado (tiene "Supported", tampoco tiene AutoComplete
> ()), es decir el que se encargada de hacer eso es el
> Componente A (que tiene "Requires", también he probado Requires New).
>
> Tambien probé deshabilitando las transacciones, es decir, ejecutar las COM
> sin transaccionalidad y me funcionó bien. Esto lo hice para despejar
> cualquier duda sobre problemas de conexión entre las maquinas y de red,
> además, los dos servidores de SQL (Mysql y MS Sql) está en la misma máquina,
> si tengo que decir que mi máquina de desarrollo no es la misma, es decir,
> tengo el proyecto en un PC distindo en donde se aloja los Servidores SQL. Es
> más cuando se inicia la aplicación pide usuario y conecta con la BBDD sin
> problemas, claro, porque ahí no utilizo nada de transacciones ni componentes
> COM+, pero cuando utilizo por ejemplo cualquier mantenimiento me salta el
> error.
> Bueno, no he dicho cuando se proboca el error, y es cuando ejecuto la
> instrucción
> MyConexion.Open(), a intentar abrir la conexión, hago llamada al componete
> de negocio de MoverRegistroSiguiente, este llama a la capa de acceso a datos
> MoverRegistroSiguiente en la cual llama al interfaz para abrir conexión y me
> da el error.
> En la cabecera de la clase de la capa de negocio tiene puesto:
> <EnterpriseServices.ObjectPooling(minPoolSize:=INT_Pooling_MIM_PoolSize,
> maxPoolSize:=INT_Pooling_MAX_PoolSize,
> CreationTimeout:=INT_Pooling_CreationTimeout)> _
> <EnterpriseServices.JustInTimeActivation()> _
> <System.EnterpriseServices.TransactionAttribute( _
> System.EnterpriseServices.TransactionOption.Required)> _
> Public Class MantemimientoCN
> '// He probado con <AutoComplete()> y sin <AutoComplete()> y da error
> '<AutoComplete()> _
> Public Function MoverRegistroSiguiente(Byval dt as DataSet) as
> DataSet
> Return oMateAD.MoverRegistroSiguiente(dt)
> End Function
> End Class
> Bueno espero que con esta información, me puedas ayudar a solucionar este
> problema.
>
> Un saludo.
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida