scieloorg / kernel

É o componente central da nova arquitetura de sistemas de informação da Metodologia SciELO, ainda em fase de desenvolvimento.
https://docs.google.com/document/d/14YBl7--4ouaWBQhxzUYWRuhmegwnSYrDgupsED6rhvM/edit?usp=sharing
BSD 2-Clause "Simplified" License
6 stars 11 forks source link

Sessions com suporte transacional #140

Closed gustavofonseca closed 4 years ago

gustavofonseca commented 5 years ago

Desde a versão 4.0 o MongoDB possui suporte a transações envolvendo múltiplos documentos em replica sets[1]. Esse tipo de transação existe no Kernel sempre que é realizada qualquer criação ou modificação em registros e uma mudança é registrada na coleção changes. Para que o banco de dados seja mantido em um estado íntegro, ou ambas as escritas ocorrem com sucesso ou todas necessitam ser abortadas (escritas atômicas). Na implementação atual não há esta garantia.

No branch https://github.com/gustavofonseca/document-store/tree/transactional-session realizei uma prova de conceito que adiciona suporte transacional à Session por meio da sintaxe de context-manager[2]. O uso é opcional, e deve ser utilizado apenas quando houverem escritas em múltiplos documentos.

O MongoDB suporta transações apenas em ReplicaSets, por conta de detalhes de implementação (o suporte depende do OpLog, que não existe em instâncias standalone como a que estamos usando no docker-compose.yml até o momento). Para usar o suporte transacional deveremos criar um entrypoint capaz de inicializar o banco de dados no modo ReplicaSet e criar as coleções necessárias. Para isso será necessário criarmos um utilitário de linha de comando ou um script de inicialização do banco de dados (estou mais inclinado ao primeiro).

[1]https://docs.mongodb.com/manual/core/transactions/ [2]https://github.com/gustavofonseca/document-store/blob/transactional-session/documentstore/adapters.py#L94