Pregunta

Hice algunas pruebas hace un tiempo y nunca descubrí cómo hacer que esto funcione.

Los ingredientes:

  • Objeto transaccional COM+ (desarrollado en VB6)
  • Aplicación web .Net (con transacción) en IIS que...
    hace una llamada al componente COM+
    actualiza una fila en una base de datos SQL

Pruebas:

Ejecute la aplicación .Net y fuerce una excepción.

Resultado:

La actualización realizada desde la aplicación .Net se revierte.
La actualización realizada por el objeto COM+ no se revierte.

Si llamo al objeto COM+ desde una página ASP antigua, la reversión funciona.

Sé que algunas personas pueden estar pensando "¡¿Qué?!COM+ y .Net ¡debes estar loco!", pero hay algunos lugares en este mundo donde todavía hay muchos componentes COM+.Solo tenía curiosidad por saber si alguien alguna vez se enfrentó a esto y si descubrió cómo hacer que esto funcione.

¿Fue útil?

Solución

Debido a que VB y .NET usarán diferentes conexiones SQL (y no hay manera de hacer que ADO y ADO.NET compartan la misma conexión), su única posibilidad es contratar al DTC (Coordinador de transacciones distribuidas).El DTC coordinará las dos transacciones independientes para que se confirmen o se reviertan juntas.

Desde .NET, EnterpriseServices administra la funcionalidad COM+, como el DTC.En .NET 2.0 y posteriores, puede utilizar el espacio de nombres System.Transactions, lo que hace que las cosas sean un poco más agradables.Creo que algo como esto debería funcionar (código no probado):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

No estoy lo suficientemente familiarizado con esto para darte más consejos en este momento.

En el lado COM+, su objeto debe configurarse para usar (muy probablemente "requerir") una transacción distribuida.Puedes hacerlo desde COM+ Explorer, yendo a la página de tu objeto. Propiedades, seleccionando el Transacción pestaña y haciendo clic en "Requerido".No recuerdo si también puedes hacer esto desde el código;VB6 se creó antes de que se lanzara COM+, por lo que no es totalmente compatible con todo lo que hace COM+ (su soporte transaccional estaba destinado al predecesor de COM+, llamado MS Transaction Server).

Si todo funciona correctamente, su objeto COM+ debería incluirse en el contexto existente creado por su código .NET.

Puede utilizar el nodo "Coordinador de transacciones distribuidas\Lista de transacciones" en "Servicios de componentes" para verificar y ver la transacción distribuida que se crea durante la llamada.

Tenga en cuenta que no puede ver los cambios del componente COM+ reflejados en las consultas de datos desde el lado .NET hasta que se confirme la transacción.De hecho, ¡es posible llegar a un punto muerto!Recuerde que DTC se asegurará de que las dos transacciones estén emparejadas, pero seguirán siendo transacciones de bases de datos separadas.

Otros consejos

¿Cómo estás implementando esto?Si está utilizando EnterpriseServices para administrar la transacción .NET, entonces ambas transacciones deberían revertirse, ya que está utilizando el mismo contexto para ambas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top