Optimización mediante el uso de la confirmación de fase única y de la inscripción de fase única promovible

En este tema se describen los mecanismos proporcionados por la infraestructura System.Transactions para optimizar el rendimiento.

Inscripción de la fase única promocionable

La infraestructura System.Transactions administra una transacción dentro de un dominio de aplicación único que implica a lo sumo un recurso durable único o varios recursos volátiles. Puesto que la infraestructura System.Transactions solo utiliza las llamadas de dominio de intraaplicación, produce el mejor rendimiento.

Sin embargo, si la transacción se proporciona a otro objeto en otro dominio de aplicación (incluso por el proceso y límites del equipo) en el mismo equipo, o si fuera dar de alta otro administrador de recursos duradero, la infraestructura System.Transactions realiza automáticamente una escalada de la transacción que va a ser administrada por MSDTC. Una transacción administrada por MSDTC no rinde tan eficazmente como uno administrado por la infraestructura System.Transactions.

Para optimizar el rendimiento, la infraestructura System.Transactions proporciona la Inscripción (PSPE) de Fase de Soltero promocionable que permite un recurso duradero remoto único, situado en un dominio de aplicación diferente, proceso o equipo, para participar en una transacción System.Transactions sin producir una escalada a una transacción de MSDTC. Este administrador de recursos (RM) puede hospedar y "poseer" una transacción que puede realizar una escalada después de una transacción distribuida (o transacción de MSDTC) si es necesario. Esto reduce aún más la oportunidad de utilizar MSDTC.

Este administrador de recursos concreto normalmente tiene sus propias transacciones no-distribuidas internas y necesita permitir convertir esas transacciones en las transacciones distribuidas en el tiempo de ejecución. Por ejemplo, SQL Server 2005 es este tipo de administrador de recursos. En tal caso, la infraestructura System.Transactions toma un rol de administración pasiva simplemente supervisando la transacción para una necesidad de subida. Para admitir la interacción entre la infraestructura System.Transactions y el administrador de recursos, este último necesita implementar la interfaz IPromotableSinglePhaseNotification.

El método EnlistPromotableSinglePhase se utiliza para dar de alta un recurso duradero único que pueda realizar después una escalada. Este método asegurar que la inscripción puede realizar una escalada según sea necesario. Si la inscripción tiene éxito, RM crea su transacción interna y la asocia a la transacción System.Transactions. En caso de error en la inscripción de PSPE, RM debería darse de alta utilizando en su lugar el método EnlistDurable. Los errores para dar de alta en PSPE podrían ocurrir cuando la transacción ya es una transacción distribuida, o cuando RM ya ha realizado una inscripción de PSPE

Cuando esté dada de alta, las llamadas por clientes para confirmar o anular la transacción System.Transactions se convierten en las llamadas en el Recurso Administrador invocando el método SinglePhaseCommit o Rollback respectivamente.

Si la transacción System.Transactions nunca requiere la subida, cuando se confirma la transacción, RM recibe una notificación SinglePhaseCommit. Puede confirmar a continuación la transacción interna que se creó inicialmente.

Si la transacción System.Transactions necesita realizar una escalada (por ejemplo, admitir varios RMs), System.Transactions informa al administrador de recursos llamando al método Promote en la interfaz ITransactionPromoter, de la que la interfaz IPromotableSinglePhaseNotification deriva. El administrador de recursos convierte a continuación internamente la transacción de una transacción local (qué no requiere el registro) en un objeto de transacción que es capaz de participar en una transacción de DTC y lo asocia al trabajo ya hecho. Cuando solicitan que la transacción se confirme, el administrador de transacciones todavía envía la notificación SinglePhaseCommit al administrador de recursos, que confirma la transacción distribuida que creó durante la subida.

Nota

Los rastros de TransactionCommited (que se generan cuando una confirmación se invoca en la transacción escalada) contienen el id. de la actividad de la transacción de DTC.

Para más información sobre el escalado de gestión, vea Gestión de la elevación de transacciones.

Escenario de subida de administración de la transacción

El escenario siguiente muestra una subida a una transacción distribuida utilizando el espacio de nombres System.Data como el 'proxy' para el administrador de recursos. Este escenario supone que es ya una conexión System.Data a la base de datos, CN1, envuelto en la transacción y la aplicación desea implicar otra conexión System.Data, CN2. La transacción debe realizar una escalada a DTC, como una transacción completa de la confirmación distribuida en dos fases.

En este escenario

  1. CN1 llama al método EnlistPromotableSinglePhase para dar de alta en la transacción. A continuación, la transacción es todavía local y no es ningún otro alistamiento promocional en la transacción, por lo que la llamada EnlistPromotableSinglePhase tiene éxito.

  2. Cuando la segunda conexión, CN2 llama EnlistPromotableSinglePhase, se da un error en la llamada, porque hay implicada otra inscripción promocional. Debido a esto, CN2 debe obtener una transacción de DTC para pasarlo a SQL. Utiliza uno de los métodos proporcionado por la clase TransactionInterop para generar un formato de la transacción que se puede dar a SQL para ello.

  3. System.Transactions llama al método Promote en la interfaz ITransactionPromoter implementada por CN1.

  4. En este punto, CN1 realiza una escalada de la transacción, utilizando algún mecanismo concreto a SQL 2005 y System.Data.

  5. El valor devuelto del método Promote es una matriz de bytes que contiene un token de propagación para la transacción. System.Transactions usa este token de propagación para crear una transacción de DTC que puede participar en la transacción local.

  6. En este punto, CN2 puede utilizar los datos recibidos de llamar a uno de los métodos por TransactionInterop para pasar la transacción a SQL.

  7. Ahora, ambos se dan de alta en una transacción distribuida de DTC.

Optimización de confirmación de fase única

La fase única el protocolo de confirmación es más eficaz en el tiempo de ejecución cuando todas las actualizaciones se hacen sin ninguna coordinación explícita. Para aprovecharse de esta optimización, debería implementar un administrador de recursos utilizando la interfaz ISinglePhaseNotification para el recurso y dar de alta en una transacción utilizando EnlistDurable o el método EnlistVolatile. En concreto, el parámetro EnlistmentOptions debería ser igual a None para garantizar que se realiza una confirmación en una fase.

Puesto que la interfaz ISinglePhaseNotification deriva de la interfaz IEnlistmentNotification, si RM no es elegible para la confirmación de la fase única, todavía puede recibir las dos notificaciones de confirmación de fase. Si RM recibe una notificación SinglePhaseCommit de la TM, debería intentar hacer el trabajo necesario para confirmar y correspondientemente informar al administrador de transacciones si la transacción será confirmada o revertirla llamando al método Committed, Abortedo InDoubt en el parámetro SinglePhaseEnlistment. Una respuesta de Done en la inscripción en esta copia intermedia implica la semántica ReadOnly. Por consiguiente, no debería contestar Done sumándose a cualquiera de los otros métodos.

Si solo se da una inscripción volátil y no duradera, ésta recibe una notificación SPC. Si hay varias inscripciones volátiles y solo una duradera, las inscripciones volátiles reciben una notificación SPC. Cuando se completa, la inscripción duradera recibe SPC.

Consulte también