Optimización con la confirmación de fase única y la confirmación de fase única promocionable

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 sólo 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 una función 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 TransactionCommitted (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 obtener más información sobre la elevación de la administración vea Extensión de administración de transacción.

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 la propagación para la transacción. System.Transactions utiliza este token de la propagación para crear una transacción de DTC que pueda incorporar 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 sólo se da una inscripción volátil y no duradera, ésta recibe una notificación SPC.  Si hay alguna inscripción volátil y sólo una inscripción duradera, las inscripciones volátiles reciben la notificación de 2PC. Cuando esté completa, la inscripción duradera recibe SPC.

Consulte también

Conceptos

Dar de alta los recursos como participantes en una transacción
Confirmar una transacción en fase única y múltiple

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.