# Shadow pages

Em banco de dados, é preciso garantir que na ocorrência de uma falha, o próprio volte ao seu estado mais consistente, ou seja, as atualizações feitas no banco devem ser desfeitas ou refeitas(UNDO/REDO). Por isso, existem algumas técnicas que os SGBDs utilizam para garantir a integridade do banco. Entretanto, existe uma técnica que não necessita realizar o UNDO ou o REDO de suas alterações. Conhecida também como técnica NO-UNDO/NO-REDO, a técnica Shadow Paging baseia-se na existência de uma tabela de blocos (páginas) de disco.

## Tabelas

* TPC: Tabela de páginas corrente é uma tabela que aponta para blocos que estão no disco, ou seja, são só o endereço que aponta para as tabelas no disco.
* TPS: Tabela de páginas de sombras é uma tabela que é a cópia da TPC.
* TPL: Tabela de páginas livres.

## Descrição

Chamada de TPC a tabela de Páginas Corrente é nossa tabela de ponteiros das páginas atuais do banco. Antes que qualquer alteração seja feita por uma transação, os ponteiros serão copiados para a Tabela de Páginas Shadow (TPS) que será responsável por armazenar o nosso estado consistente do banco. Ou seja, a cópia registra os ponteiros de onde estão localizados os dados da TPC que são ponteiros das páginas atuais do banco. A partir daí, a transação já pode fazer suas alterações e esses blocos alterados serão copiados para blocos livres da TPC, ou seja, as alterações não sobrescrevem os valores antigos, mas sim são armazenados em novos blocos livres da TPC (TPL). Por fim, a TPC é atualizada com os novos ponteiros e novos valores. A TPS somente irá entrar em ação, caso aconteça alguma falha. Então, caso isso isso ocorra, a TPC será descartada e a TPS torna-se a nova TPC. Mas, se essa falha não ocorrer quem será descartada será a TPS, visto que o novo estado consistente foi atingido.

### Gerenciamento do Buffer

O mecanismo de gerenciamento do buffer utilizado nessa técnica é o FORCE. Essa técnica obriga que o bloco de cache usado por uma transação deve ser gravado no banco imediatamente após o commit, ou seja, as alterações feitas por uma transação só podem ser gravadas no banco após ser solicitado o commit (finalização da transação).

## Passo-a-passo

1. TPC é copiado para TPS.
2. É realizado o FORCE da TPS para salvar a cópia em disco (banco).
3. Se for a primeira vez que a transação atualiza aquele bloco, ele é carregado na cache e então salva na TPL as atualizações da transação.
4. Atualiza os dados na TPC que agora aponta para os novos blocos livres (ou que deixaram de ser livres).
5. Quando a transação pede commit, ela dá FORCE na TPC com as páginas atualizadas para ir ao disco.

## Conclusão

Se ocorrer uma falha antes do passo de número 5, não é preciso fazer o UNDO, pois o TPS contém as páginas de estados consistentes. Se a falha ocorrer após o commit, também não é preciso fazer o REDO, pois as atualizações já estão garantidas no banco.

### Vantagens

* Não é preciso acessar o banco de dados para fazer restaurações.
* Não é necessário fazer UNDO e REDO das transações.

### Desvantagens

* Gerenciamento complexo para um SGBD Multiusuário.
* Não mantém os dados clusterizados.
* Requer coleta de lixo (paǵinas precisam ser adicionadas à TPL).