Compartir a través de


Transacciones distribuidas (ADO.NET)

Actualización: November 2007

Entre otras cosas, una transacción es un conjunto de tareas relacionadas que se ejecutan correctamente (confirman) o dan error (anulan) como una unidad. Una transacción distribuida es una transacción que afecta a varios recursos. Para que una transacción distribuida se confirme, todos los participantes deben garantizar que los cambios en los datos serán permanentes. Los cambios deben mantenerse a pesar de bloqueos del sistema u otros eventos imprevistos. Si alguno de los participantes no cumple esta garantía, toda la transacción da error y se revertirán los cambios en los datos en el ámbito de la transacción.

Nota:

Si intenta confirmar o revertir una transacción al iniciar un DataReader mientras la transacción está activa, se produce una excepción.

Trabajo con System.Transactions

En .NET Framework, las transacciones distribuidas se administran a través de la API del espacio de nombres System.Transactions. Cuando hay implicados varios administradores de recursos persistentes, la API System.Transactions delegará el control de las transacciones distribuidas en un monitor de transacciones como el Coordinador de transacciones distribuidas de Microsoft (MS DTC). Para obtener más información, vea Principios de la transacción.

ADO.NET 2.0 incorporó la compatibilidad con la inscripción en una transacción distribuida mediante el método EnlistTransaction, que inscribe una conexión en una instancia de Transaction. En las versiones anteriores de ADO.NET, la inscripción explícita en transacciones distribuidas se realizaba mediante el método EnlistDistributedTransaction de una conexión que inscribía ésta en una instancia ITransaction, en la que se permitía la compatibilidad con versiones anteriores. Para obtener más información acerca de las transacciones de Enterprise Services, vea Interoperabilidad con Enterprise Services y transacciones de COM+.

Cuando se utiliza una transacción System.Transactions con el proveedor de datos de .NET Framework para SQL Server en una base de datos SQL Server 2005, se usará automáticamente una Transaction ligera. A continuación, la transacción se puede promover a una transacción distribuida completa si es necesario. Para obtener más información, vea Integración de System.Transactions con SQL Server (ADO.NET).

Nota:

El número máximo de transacciones distribuidas en las que puede participar una base de datos de Oracle a la vez se establece de forma predeterminada en 10. Después de la décima transacción en una conexión a una base de datos de Oracle, se inicia una excepción. Oracle no admite DDL en las transacciones distribuidas.

Inscripción automática en una transacción distribuida

La inscripción automática es el método predeterminado (y preferido) de integrar conexiones ADO.NET con System.Transactions. Un objeto de conexión se inscribirá automáticamente en una transacción distribuida existente si se determina que hay una transacción activa, que, en términos de System.Transaction, significa que Transaction.Current no es nula. La inscripción automática en transacciones tiene lugar cuando se abre la conexión. No ocurrirá después, incluso si se ejecuta un comando dentro del ámbito de una transacción. Puede deshabilitar la inscripción automática en transacciones existentes si especifica Enlist=false como un parámetro de cadena de conexión para una ConnectionString, o OLE DB Services=-7 como un parámetro de cadena de conexión para una ConnectionString. Para obtener más información acerca de los parámetros de cadena de conexión de Oracle y ODBC, vea ConnectionString y ConnectionString.

Inscripción manual en una transacción distribuida

Si la inscripción automática está deshabilitada o es necesario inscribir la conexión en una transacción que se ha iniciado después de abierta la conexión, puede inscribirla en una transacción distribuida existente mediante el método EnlistTransaction del objeto DbConnection correspondiente al proveedor con el que esté trabajando. La inscripción en una transacción distribuida existente garantiza que, si la transacción se confirma o revierte, también se confirmarán o revertirán las modificaciones realizadas por el código en el origen de datos.

La inscripción en transacciones distribuidas es especialmente conveniente al agrupar objetos empresariales. Si se agrupa un objeto empresarial con una conexión abierta, la inscripción automática en transacciones sólo se produce cuando se abre esa conexión. Si se realizan varias transacciones con el objeto empresarial agrupado, la conexión abierta para ese objeto no se inscribirá automáticamente en las transacciones recién iniciadas. En este caso, puede deshabilitar la inscripción automática de la conexión en la transacción e inscribir la conexión en las transacciones mediante EnlistTransaction.

EnlistTransaction acepta un único argumento del tipo Transaction que es una referencia a la transacción existente. Después de llamar al método EnlistTransaction de la conexión, todas las modificaciones realizadas en el origen de datos mediante la conexión se incluyen en la transacción. Si se pasa un valor nulo, se anula la inscripción de la conexión de su inscripción actual en transacciones distribuidas. Tenga en cuenta que la conexión se debe abrir antes de llamar a EnlistTransaction.

Nota:

Una vez que una conexión se inscribe explícitamente en una transacción, no se puede anular su inscripción ni inscribirse en otra transacción hasta que finaliza la primera transacción.

Precaución:

Si la conexión ya ha comenzado una transacción mediante el método BeginTransaction de la conexión, EnlistTransaction inicia una excepción. No obstante, si la transacción es una transacción local iniciada en el origen de datos (por ejemplo, al ejecutar la instrucción BEGIN TRANSACTION de forma explícita mediante un SqlCommand), EnlistTransaction la revertirá e inscribirá en la transacción distribuida existente como se ha solicitado. No recibirá aviso de que la transacción local se ha revertido y deberá administrar todas las transacciones locales no iniciadas mediante BeginTransaction. Si utiliza el proveedor de datos de .NET Framework para SQL Server (SqlClient) con SQL Server 2005, al intentar una inscripción se producirá una excepción. Todos los demás casos no se detectarán.

Transacciones promocionadas en SQL Server 2005

SQL Server 2005 admite transacciones promocionadas en las que una transacción ligera se puede promover automáticamente a distribuida solamente cuando es necesario. Las transacciones promocionadas no invocan la sobrecarga adicional de las transacciones distribuidas a menos que sea necesario. Para obtener más información y un ejemplo de código, vea Integración de System.Transactions con SQL Server (ADO.NET).

Configuración de transacciones distribuidas

Es posible que deba habilitar el MS DTC a través de la red para usar transacciones distribuidas en un sistema operativo más nuevo con los últimos Service Packs aplicados, como Windows XP o Windows Server 2003. Si tiene habilitado Firewall de Windows (valor predeterminado en Windows XP Service Pack 2), debe permitir que el servicio MS DTC use la red o debe abrir el puerto de MS DTC.

Vea también

Conceptos

Integración de System.Transactions con SQL Server (ADO.NET)

Otros recursos

Transacciones y simultaneidad (ADO.NET)