Consultas distribuidas y transacciones distribuidas
El SQL Server Database Engine (Motor de base de datos de SQL Server) permite crear vínculos a orígenes de datos OLE DB llamados servidores vinculados. Tras vincularse a un origen de datos OLE DB, puede:
Hacer referencia a conjuntos de filas de los orígenes de datos OLE DB como tablas en instrucciones Transact-SQL.
- Pasar comandos a los orígenes de datos OLE DB e incluir los conjuntos de filas resultantes como tablas en instrucciones de Transact-SQL.
Cada consulta distribuida puede hacer referencia a varios servidores vinculados o realizar operaciones de actualización o lectura con cada servidor vinculado individual. Una sola consulta distribuida puede realizar operaciones de lectura con unos servidores vinculados y operaciones de actualización con otros servidores vinculados. En general, el Database Engine (Motor de base de datos) requiere admitir transacciones distribuidas del proveedor OLE DB correspondiente siempre que en una transacción se actualicen los datos de más de un servidor vinculado. De esta forma, los tipos de consultas que se admiten con los servidores vinculados dependen del nivel de admisión de transacciones presente en los proveedores OLE DB. OLE DB define dos interfaces opcionales para la administración de transacciones:
- ITransactionLocal acepta transacciones locales en el origen de datos OLE DB.
- ITransactionJoin permite al proveedor combinar una transacción distribuida que contiene otros administradores de recursos.
Cualquier proveedor que admita ITransactionJoin también admitirá ITransactionLocal.
Si se ejecuta una consulta distribuida cuando la conexión está en modo de confirmación automática, se aplican las reglas siguientes:
- Sólo se permite realizar operaciones de lectura con proveedores que no acepten ITransactionLocal.
- Se permiten todas las operaciones de actualización con todos los proveedores que acepten ITransactionLocal.
La instancia de control del Database Engine (Motor de base de datos) llama automáticamente a ITransactionLocal en cada servidor vinculado que participe en una operación de actualización para iniciar una transacción local. Si la instrucción se completa correctamente, los confirma, pero, si la instrucción genera un error, los revierte.
Si una consulta distribuida es con una vista distribuida con particiones, o bien si se ejecuta cuando la conexión se encuentra en una transacción explícita o implícita, se aplican las reglas siguientes:
- Sólo se permite realizar operaciones de lectura con proveedores que no acepten ITransactionJoin. Los proveedores que no admitan transacciones o sólo admitan ITransactionLocal no pueden participar en operaciones de actualización.
- Si SET XACT_ABORT está establecido en ON, se permiten todas las operaciones de actualización con los proveedores que admitan ITransactionJoin. La instancia de control del Database Engine (Motor de base de datos) llama automáticamente a ITransactionJoin en cada servidor vinculado que participe en una operación de actualización para inscribirle en la transacción distribuida. A continuación, el Coordinador de transacciones distribuidas de Microsoft (MS DTC) las confirma o revierte cuando el servidor de control indica que la transacción se ha confirmado o revertido.
- Si SET XACT_ABORT está establecido en OFF, el servidor vinculado también debe aceptar transacciones anidadas para que se permitan las operaciones de actualización. Se admiten transacciones anidadas si el proveedor admite las llamadas a ITransactionLocal::StartTransaction cuando ya hay una transacción para la sesión. Esto permite a SQL Server revertir instrucciones individuales en consultas distribuidas sin revertir toda la transacción.
Las reglas anteriores implican la siguiente restricción para los proveedores que no admiten transacciones anidadas: se permiten operaciones de actualización en transacciones distribuidas sólo si la opción XACT_ABORT está establecida en ON.