#36
O RECO é utilizado para controlar instruções DML (Insert, Update, Delete) gerada em transação distribuída.
Mas agora fica a pergunta, mas o que é uma transação distribuída? Uma transação distribuida consiste em atualizações em dois ou mais banco de dados. Esse tipo de transação é projetada por programadores e opera por meio de links de bancos de dados.
Observe essa instrução DML,
UPDATE aluno SET nota = 30 WHERE aluno_id = 10;
UPDATE aluno@LINK_BANCO SET nota = 30 WHERE aluno_id = 10;
COMMIT;
O mesmo UPDATE é aplicado a duas tabelas iguais, mas em banco de dados diferentes, o primeiro Update é executado no banco de dados local, o segundo em um banco de dados remoto indentificado pelo LINK do banco de dados.
A terceira instrução é o COMMIT, reelembrando, o que um COMMIT faz quando é executado. Assim que o COMMIT é chamado o LGWR é forçado a gravar nos arquivos de Redo Log Online, enquanto a gravação esta sendo processada a sessão que chamou o COMMIT fica suspensa, quando o COMMIT é finalizado com sucesso a sessão volta a funcionar normalmente.
Em uma transação distribuida a situação não é muito diferente, mas, é adicionado mais uma etapa na confirmação do COMMIT, o nome do COMMIT em uma transação distribuída é, commit de duas fases (two-phase commit). O COMMIT em cada banco é coordenado através de dados globais, a primeira fase do COMMIT, é o comando para o LGWR realizar o flush do buffer de log, se o COMMIT for bem sucedido em todos os bancos de dados, então é iniciado a segunda fase, que marca a transação como confirmada nos dados globais e com isso a sessão continua normalmente. Mas no caso, na primeira fase, um banco retorna a confirmação de COMMIT bem sucedido e no outro banco não tiver a confirmação, então os dados globais estariam em um estado de inconsistente e é nessa parte que o RECO entra em ação. Quando algo sai errado em algum lugar entre as duas fazes, o RECO assume o controle para cancelar o COMMIT e fazer um ROLLBACK da transação em todos os bancos de dados envolvidos.
Se tiverem dúvidas realizem um INSERT nos comentários e depois dê um COMMIT que depois respondo.
Abraço e bons estudos.
Comentários
Postar um comentário