Error de Transacciones con COM+

22/02/2006 - 20:21 por AOG | Informe spam
Hola tengo el siguiente problema:
Tengo un solucion en VB 2005 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 Jesús López
22/02/2006 - 20:35 | Informe spam
Algunas recomendaciones:

- Desactiva todo Object Pooling. El Object Pooling es muy problemático con
objetos transacionales.
- Marca todos los métodos con AutoComplete()
- El objeto raíz (Componente A) debería tener TransactionRequied o
TransactionNew
- Los demás objetos deberían tener TransactionRequired.

El único atributo que necesitan las clases es el de
Transaction(TransactionOption.Required). El de object pooling es un incordio
y los demás son implicitos a los objetos transacionales: JustInTime y
Synchronization.

Ojo: con MySql no tienes ningún problema, porque 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.

Saludos:

Jesús López
MVP



"AOG" escribió en el mensaje
news:
Hola tengo el siguiente problema:
Tengo un solucion en VB 2005 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 - 18:43 | Informe spam
Hola Jesús, gracias por tu aportación.

He desactivado todo Object Pooling y marca todos los métodos con
AutoComplete()
sigue dandome el mismo error.

Esto me desanima a utilizar el servicio EnterpriseServices, porque es un
cumulo de problemas que me está creando en su utilización, y me está
demorando el proyecto, y, al final no le veo rendimiento ni mejora en mi
proyecto, y ya que me has dicho que utilizando MySql no va las transacciones
pues casi me da igual solucionar este problema ya que en mi proyecto ya no
puedo utilizar la gestion de transacciones distribuidas que facilita COM+ y
tendré que utilizar las que me facilita la conexion de la base de datos, y si
el servicio Object Pooling da problemas lo unico que utilizo es la gestion
de excepciones y creo que también puedo presindir de este servicio.
He leido alguna documentación (en msdn, msdn video que lo recomienda y
Webcast) de lo que puede hacer estos servicios, pero no se, supongo que será
por mi poca experiencia en el desarrollo en la plataforma net y utilizacion
de COM+ ya que vengo de VB5 y tengo que pasar un proyecto que mas o menos es
grande ha esta plataforma, y de verdad me está costando con esto nuevos
conceptos de arquitecturas.
Es una Facturación en toda regla con muchos módulos que abarca varios
sectores y debe de funcionar en de varias formas, desde monopuesto hasta en
una intranet con o sin servicios Web por medio de las capa IU y negocio,
pudiendo elegir el cliente con una BBDD de MS SQLServer o MySQL. como verás
tengo mucho trabajo por delante.
Bueno no me extiendo más, se acepta consejos o opiniones, muchas gracias.
Un saludo.

"Jesús López" escribió:

Algunas recomendaciones:

- Desactiva todo Object Pooling. El Object Pooling es muy problemático con
objetos transacionales.
- Marca todos los métodos con AutoComplete()
- El objeto raíz (Componente A) debería tener TransactionRequied o
TransactionNew
- Los demás objetos deberían tener TransactionRequired.

El único atributo que necesitan las clases es el de
Transaction(TransactionOption.Required). El de object pooling es un incordio
y los demás son implicitos a los objetos transacionales: JustInTime y
Synchronization.

Ojo: con MySql no tienes ningún problema, porque 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.

Saludos:

Jesús López
MVP



"AOG" escribió en el mensaje
news:
> Hola tengo el siguiente problema:
> Tengo un solucion en VB 2005 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
#3 Jesús López
23/02/2006 - 20:12 | Informe spam
¿Podrías poner el código del componente oMateAD.MoverRegistroSiguiente(dt)?

Me da la sensación de que ese componente reutiliza la conexión. En COM+
todos los componentes transacionales deben ser sin estado así que
oMateAD.MoverRegistroSiguiente(dt)? debería abrir la conexión y cerrarla
antes de volver. ¿Es lo que estás haciendo?

Saludos:

Jesús López
MVP



"AOG" escribió en el mensaje
news:
Hola Jesús, gracias por tu aportación.

He desactivado todo Object Pooling y marca todos los métodos con
AutoComplete()
sigue dandome el mismo error.

Esto me desanima a utilizar el servicio EnterpriseServices, porque es un
cumulo de problemas que me está creando en su utilización, y me está
demorando el proyecto, y, al final no le veo rendimiento ni mejora en mi
proyecto, y ya que me has dicho que utilizando MySql no va las
transacciones
pues casi me da igual solucionar este problema ya que en mi proyecto ya no
puedo utilizar la gestion de transacciones distribuidas que facilita COM+
y
tendré que utilizar las que me facilita la conexion de la base de datos, y
si
el servicio Object Pooling da problemas lo unico que utilizo es la
gestion
de excepciones y creo que también puedo presindir de este servicio.
He leido alguna documentación (en msdn, msdn video que lo recomienda y
Webcast) de lo que puede hacer estos servicios, pero no se, supongo que
será
por mi poca experiencia en el desarrollo en la plataforma net y
utilizacion
de COM+ ya que vengo de VB5 y tengo que pasar un proyecto que mas o menos
es
grande ha esta plataforma, y de verdad me está costando con esto nuevos
conceptos de arquitecturas.
Es una Facturación en toda regla con muchos módulos que abarca varios
sectores y debe de funcionar en de varias formas, desde monopuesto hasta
en
una intranet con o sin servicios Web por medio de las capa IU y negocio,
pudiendo elegir el cliente con una BBDD de MS SQLServer o MySQL. como
verás
tengo mucho trabajo por delante.
Bueno no me extiendo más, se acepta consejos o opiniones, muchas gracias.
Un saludo.

"Jesús López" escribió:

Algunas recomendaciones:

- Desactiva todo Object Pooling. El Object Pooling es muy problemático
con
objetos transacionales.
- Marca todos los métodos con AutoComplete()
- El objeto raíz (Componente A) debería tener TransactionRequied o
TransactionNew
- Los demás objetos deberían tener TransactionRequired.

El único atributo que necesitan las clases es el de
Transaction(TransactionOption.Required). El de object pooling es un
incordio
y los demás son implicitos a los objetos transacionales: JustInTime y
Synchronization.

Ojo: con MySql no tienes ningún problema, porque 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.

Saludos:

Jesús López
MVP



"AOG" escribió en el mensaje
news:
> Hola tengo el siguiente problema:
> Tengo un solucion en VB 2005 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
#4 AOG
24/02/2006 - 18:41 | Informe spam
Hola Jesús, esto es lo que hago en la capa de acceso a datos, para
simplificar solo te pongo la inicialización, finalizacion y un metodo Mover
de la clase (hay más como Buscar, Actualizar... al igual que en las demás
clase):
- Clase MantenimientoAD
Public Class MantenimientoAD
Private oDB As Libreria.Datos.Tabla

Private MiPlataforma As Plataformas
Private MiServidor As String
Private MiBaseDatos As String
Private MiUsuario As String
Private MiClave As String

Public Sub New(ByVal xBaseDatos As String)
Me.MiPlataforma = ComunAD.Plataforma '// MS Sql o MySQL
Me.MiServidor = ComunAD.NombreServidor
Me.MiBaseDatos = xBaseDatos
Me.MiUsuario = ComunAD.UsuarioBD
Me.MiClave = ComunAD.ClaveBD
oDB = New Libreria.Datos.Tabla(Plataforma, Servidor, BaseDatos,
Usuario, Clave)
End Sub

Public Function Mover(ByVal BaseDatos As String, ByVal Dt As Data.DataSet, _
ByVal HaciDonde As Integer, _
Optional ByVal aCampos As ArrayList = Nothing) As
Data.DataSet
Return oDB.Mover(BaseDatos, Dt.Tables(0), CType(HaciDonde,
Tabla.MoverRegistro), aCampos).DataSet
End Function

Protected Overrides Sub Finalize()
oDB.Dispose()
MyBase.Finalize()
End Sub
End Class

- Clase Tabla
Namespace Libreria.Datos
Public Class Tabla
Public Enum MoverRegistro
Primero = 1
Anterior = 2
Seguiente = 3
Ultimo = 4
End Enum

Private oDb As Datos.ProveedorDatos 'Interfaz que abre, cierrar
conexiones, crea Command, DataReader, DataAdapter
Private oSqlClient As Datos.SqlClient 'Clase que devuelve objetos
tipo IDbCommand, IDbConnection, ... la cadenada de conexion, SQL con la
sintaxis que conrresponde según que plataforma que utilizamos MS Sql o MySQl

Private _MiBaseDatos As String
Private _Plataforma As Integer
Private _Servidor As String
Private _BaseDatos As String
Private _Usuario As String
Private _Password As String

Public Function Mover(ByVal BaseDatos As String, _
ByVal Tabla As DataTable, _
ByVal HaciDonde As MoverRegistro) As DataTable
Dim bOk As Boolean = True
Dim ORDERBY As String = ""
Dim bAsc As Boolean = True
Dim miTabla As New DataTable
Dim Where As String = ""
Dim sCaracterCondicion As String = ""
Dim miParametros() As IDbDataParameter = Nothing
Select Case HaciDonde
Case MoverRegistro.Primero 'Primero
bAsc = True
sCaracterCondicion = "="
Case MoverRegistro.Anterior 'Anterio
bAsc = False
sCaracterCondicion = "<"
Case MoverRegistro.Seguiente 'Siguiente
bAsc = True
sCaracterCondicion = ">"
Case MoverRegistro.Ultimo 'Ultimo
bAsc = False
sCaracterCondicion = "="
End Select
ObtenerWhereOrderBy(Tabla, Where, miParametros, ORDERBY,
sCaracterCondicion, GetStrParametro())
If HaciDonde = 1 Or HaciDonde = 4 Then Where = ""
oDb.Base = BaseDatos
miTabla = oDb.EjecutaSeleccion(Tabla.TableName, Where,
GetStrTodosCampos(), ORDERBY, bAsc, 1, miParametros)
If miTabla IsNot Nothing AndAlso miTabla.Rows.Count > 0 Then
Tabla.Clear()
Tabla.Load(miTabla.CreateDataReader)
End If
'Metodo que cierra conexion
'Dentro de oDb.Dispose->MiConexion.Close: MiConexion.Dispose
If oDb IsNot Nothing Then oDb.Dispose()
Return Tabla
End Function

Simplificando: la Capa de Negocio (MantenimientoCN) llama a la Capa de
Acceso a Datos (MantenimientoAD), esta a su vez llama a una clase (Tabla) que
es donde Busca, Actualiza, Mueve, etc, en este caso el método Mover crea en
el metodo ObtenerWhereOrderBy un array de parámetros con lo/s campo/s y
valores del filtro de busqueda, crea la cadena del filtro por ejemplo (Where
Cod = @Cod si es MS Sql O Where Cod = ?Cod en el caso de MySql), es decir
crea parte de la SQL, y al final llama a la clase ProveedorDatos al metodo
oDb.EjecutaSeleccion donde se le pasa los parametro necesarios para contruir
la SQL completa y crea un Conexion asignarla a un Command y ejecutar la sql
en el Command (mCom.ExecuteReader) y de ahí obtengo el DataSet con la fila
que corresponde. Y desde el metodo Tabla.Mover() cierro la conexion y la
descargo ( MiConexion.Close : MiConexion.Dispose) cuando ejecuto If oDb IsNot
Nothing Then oDb.Dispose() 'Cierra conexion


Estoy utilizando interfase IDbCommand, IDbConnection ya que puede ser de
tipo MS Sql o MySQL la conexión a la BBDD.

Espero que te "aclare" algo más de lo que estoy haciendo, y espero que no te
haya liado ya que parece un poco engorroso, pero bueno, se me ha complicado
la implementación a tener que hacer que la aplicación funcione con MS Sql o
MySql. Admito críticas y consejos que mejore tanto en la claridad de la
implentacion como optimización en el rendimiento.

Si tienes alguna duda no dudes en exponerla.
Un Saludo.


Un Saludo.

"Jesús López" escribió:

¿Podrías poner el código del componente oMateAD.MoverRegistroSiguiente(dt)?

Me da la sensación de que ese componente reutiliza la conexión. En COM+
todos los componentes transacionales deben ser sin estado así que
oMateAD.MoverRegistroSiguiente(dt)? debería abrir la conexión y cerrarla
antes de volver. ¿Es lo que estás haciendo?

Saludos:

Jesús López
MVP



"AOG" escribió en el mensaje
news:
> Hola Jesús, gracias por tu aportación.
>
> He desactivado todo Object Pooling y marca todos los métodos con
> AutoComplete()
> sigue dandome el mismo error.
>
> Esto me desanima a utilizar el servicio EnterpriseServices, porque es un
> cumulo de problemas que me está creando en su utilización, y me está
> demorando el proyecto, y, al final no le veo rendimiento ni mejora en mi
> proyecto, y ya que me has dicho que utilizando MySql no va las
> transacciones
> pues casi me da igual solucionar este problema ya que en mi proyecto ya no
> puedo utilizar la gestion de transacciones distribuidas que facilita COM+
> y
> tendré que utilizar las que me facilita la conexion de la base de datos, y
> si
> el servicio Object Pooling da problemas lo unico que utilizo es la
> gestion
> de excepciones y creo que también puedo presindir de este servicio.
> He leido alguna documentación (en msdn, msdn video que lo recomienda y
> Webcast) de lo que puede hacer estos servicios, pero no se, supongo que
> será
> por mi poca experiencia en el desarrollo en la plataforma net y
> utilizacion
> de COM+ ya que vengo de VB5 y tengo que pasar un proyecto que mas o menos
> es
> grande ha esta plataforma, y de verdad me está costando con esto nuevos
> conceptos de arquitecturas.
> Es una Facturación en toda regla con muchos módulos que abarca varios
> sectores y debe de funcionar en de varias formas, desde monopuesto hasta
> en
> una intranet con o sin servicios Web por medio de las capa IU y negocio,
> pudiendo elegir el cliente con una BBDD de MS SQLServer o MySQL. como
> verás
> tengo mucho trabajo por delante.
> Bueno no me extiendo más, se acepta consejos o opiniones, muchas gracias.
> Un saludo.
>
> "Jesús López" escribió:
>
>> Algunas recomendaciones:
>>
>> - Desactiva todo Object Pooling. El Object Pooling es muy problemático
>> con
>> objetos transacionales.
>> - Marca todos los métodos con AutoComplete()
>> - El objeto raíz (Componente A) debería tener TransactionRequied o
>> TransactionNew
>> - Los demás objetos deberían tener TransactionRequired.
>>
>> El único atributo que necesitan las clases es el de
>> Transaction(TransactionOption.Required). El de object pooling es un
>> incordio
>> y los demás son implicitos a los objetos transacionales: JustInTime y
>> Synchronization.
>>
>> Ojo: con MySql no tienes ningún problema, porque 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.
>>
>> Saludos:
>>
>> Jesús López
>> MVP
>>
>>
>>
>> "AOG" escribió en el mensaje
>> news:
>> > Hola tengo el siguiente problema:
>> > Tengo un solucion en VB 2005 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