Distributed transactions
Se aplica a: .NET Framework .NET .NET Standard
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 conservarse 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
Para obtener información sobre las transacciones en Azure SQL Database y Azure SQL Managed Instance, consulte Transacciones distribuidas en bases de datos en la nube.
Trabajo con System.Transactions
En .NET, 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 Aspectos básicos de las transacciones.
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 sobre 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 SqlClient de Microsoft para SQL Server en una base de datos SQL Server, se usa automáticamente un objeto Transaction ligero. 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.
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 las transacciones existentes si especifica Enlist=false
como un parámetro de cadena de conexión para un objeto SqlConnection.ConnectionString.
Inscripción manual en una transacción distribuida
Si la inscripción automática está deshabilitada o tiene que inscribir una transacción que se ha iniciado después de abrir la conexión, puede realizar la inscripción en una transacción distribuida existente mediante el método EnlistTransaction
del objeto SqlConnection para el proveedor de datos SqlClient de Microsoft para SQL Server. 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.
Nota
Si intenta confirmar o revertir una transacción al iniciar un DataReader
mientras la transacción está activa, se produce una excepción.
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 de 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 EnlistTransaction
de la conexión, BeginTransaction 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 usa el proveedor de datos SqlClient de Microsoft para SQL Server con SQL Server, al intentar una inscripción se iniciará una excepción. Todos los demás casos no se detectarán.
Transacciones aptas para promoción en SQL Server
SQL Server 2005 admite transacciones que se pueden promover en las que se pueda promover automáticamente una transacción ligera local a una transacción distribuida solamente cuando es necesario. Las transacciones promovibles 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.
Configuración de transacciones distribuidas
Puede que necesite habilitar MS DTC a través de la red para usar transacciones distribuidas. Si tiene el Firewall local de Windows del servidor habilitado, debe permitir que el servicio MS DTC use la red, o bien abrir el puerto MS DTC.