ITESM Campus Cd. De México Bases de datos Distribuidas TRANSACCIONES DISTRIBUIDAS Profesor Dr. Fco. Javier Cartujano E. TRANSACCIONES DISTRIBUIDAS Una transacción distribuida es aquella que involucra algún proceso en distintos sitios de la red. Llamaremos a estos procesos los agentes de la transacción, entonces una transacción distribuida esta compuesta por varios agentes. Para llevar a cabo una transacción distribuida los agentes tienen que comunicarse a través de mensajes en la red y se debe garantizar la atomicidad de la transacción. En una transacción distribuida se tiene lo siguiente: 1.- Existe un agente raíz que inicia toda la transacción, así que cuando el usuario requiere la ejecución de una aplicación distribuida el agente raíz es iniciado; el sitio del agente raíz es llamado el sitio origen de la transacción. 2.-El agente raíz tiene la responsabilidad de asegurar BEGIN-TRANSACTION, COMMIT O ROLLBACK de toda la transacción distribuida. UN EJEMPLO DE TRANSACCION DISTRIBUIDA AGENTE RAÍZ LEE ($CANT,$DE_CUENTA,$A_CUENTA) BEGIN_TRANSACTION SELECT AMOUNT INTO $SALDO_DE FROM ACCOUNT WHERE ACCOUNT_NUMBER=$DE_CUENTA; IF $SALDO_DE < $CANT THEN ROLLBACK ELSE BEGIN UPDATE ACCOUNT SET AMOUNT = AMOUNT - $CANT WHERE ACCOUNT_NUMBER = $DE_CUENTA CREATE AGENTE1 SEND TO AGENTE1 ($CANT, $A_CUENTA) COMMIT END AGENTE1 RECEIVE FROM AGENTE_RAIZ ($CANTIDAD, $A_CUENTA) UPDATE ACCOUNT SET CANTIDAD = CANTIDAD + $CANTIDAD WHERE ACCOUNT_NUMBER = $A_CUENTA TRANSACCIÓN DISTRIBUIDA BEGIN-TRANSACTION COMMIT ROLLBACK AGENTE RAÍZ AGENTE 1 AGENTE 2 Sitio 1 Sitio 2 SITIO ORIGEN AGENTE N Sitio N Para propósito del manejador de transacciones distribuidas (DTM), requieren que los LTM se conformen de la siguiente manera: 1.- Asegurar la atomicidad de su transacción. 2.- Grabar en bitácora por ordenes de la transacción distribuida. Para asegurar que todas las acciones de una transacción distribuida son ejecutadas o no ejecutadas dos condiciones son necesarias: a) En cada sitio todas las acciones son ejecutadas o ninguna es ejecutada. b) Todos los sitios deberán tomar la misma decisión respecto al COMMIT o ROLLBACK de la transición global. “RECUPERACIÓN DE TRANSACCIONES DISTRIBUIDAS” Para realizar la recuperación de transacción distribuidas se asume que cada sitio tiene su propio manejador de transacción local (LTM). Cada agente utiliza de manera local las primitivas asociadas a sus transacciones. Podemos llamar a los agentes subtransacciones, lo cual origina distinguir las primitivas BEGIN-TRANSACTION, COMMIT Y ROLLBACK asociado a la transacción distribuida de la primitivas locales utilizada por cada agente en LTM; para poder distinguir una de las otras, a las ultimas les llamaremos de ahora en adelante: LOCAL-BEGIN, LOCAL-COMMIT Y LOCALROLLBACK. !"# !"#&' + " ( ( )* /1 5 67!6362& $ % " ( ( )* +, , % " ( ( )* , . . , .,,/ , 0 , , $, % . . 2" ( ( )* 34 PROTOCOLO COMMIT DE DOS FASES En este protocolo hay un agente que tiene un papel especial, este agente es llamado el coordinador (el cual es el agente raíz) y todos los demás agentes son llamados PARTICIPANTES. El COORDINADOR es el responsable de tomar la decisión de hacer un COMMIT o un ROLLBACK GLOBAL y cada PARTICIPANTE es responsable de grabar a sus bitácoras y bases de datos locales. La idea básica del protocolo en dos fases (2pc) es determinar una decisión única para todos los participantes con respecto a hacer un COMMIT o un ROLLBACK en todas las subtransacciones locales. La primera fase de este protocolo tiene como objetivo lograr una decisión común, la meta de la segunda fase es llevar a cabo esta decisión. El protocolo COMMIT EN DOS FASES FASE 1 COORDINADOR a) Escribe en bitácora el registro "PREPARE" { además tiene todos los identificadores de todas las subtransacciones locales }. PARTICIPANTE Espera por mensaje "PREPARE" Si el participante esta listo para COMMIT entonces: 1) Escribe los registros de las subtransacciones en las bitácoras 2) Escribe "READY" en bitácora. 3) Manda la respuesta de "READY" al coordinador. Si_No 1) Escribe "ABORT" o "ROLLBACK" en la bitácora. 2) Manda "ABORT" como respuesta al coordinador. Fin_Si b) Manda el mensaje "PREPARE" y activa TIMEOUT. FASE 2 COORDINADOR Espera por respuesta ("READY" o "ABORT") de todos los participantes o TIMEOUT EXPIRADO. Si TIMEOUT expiró o alguna de las respuestas es "ABORT" entonces 1) escribe "GLOBAL_ABORT" en la bitácora 2) manda "ABORT" a todos los participantes Si_no {todas las respuestas fueron "READY"} 1) escribe "GLOBAL_COMMIT" en la bitácora. 2) manda "COMMIT" a todos los participantes Fin_Si PARTICIPANTE a) Espera el mensaje de comando ("ABORT" o "COMMIT"). COORDINADOR b) Escribe "ABORT" o "COMMIT" en la bitácora. a) Espera por "ACK" participantes. c) Manda el mensaje de (reconocimiento) al coordinador. a) Escribe "COMPLETE" en la bitácora. d) Ejecuta el "COMMIT"). comando de todos los "ACK“ ("ABORT" o