O que fazer quando nem transações ou transações aninhadas são suportadas?
-
27-09-2019 - |
Pergunta
O TransactionsCope é um recurso incrível, mas poucos fornecedores o implementam corretamente. Não quero passar a conexão como parâmetro.
Solução
Não tenho certeza do que você queria alcançar usando o TransactionsCope aqui - se a idéia deve ter fluxo auotmático de transações entre os métodos (e um simples alistamento dentro da transação em andamento), passar a conexão como parâmetro não é a única maneira. Você pode passar a conexão e transação atuais usando a corrente Calcontext (ou thread atual). Coloque um invólucro estático simples que verifique se a conexão/transação existe no contexto atual da chamada e cria se não. Esta é uma maneira não intrusiva transparente, em oposição à passagem por parâmetro.
Agora, se você estiver olhando para transações fluidas entre os limites do domínio do aplicativo e/ou usando vários gerentes de recursos (ou seja, usando transações distribuídas), a melhor aposta seria usar o transactionscope e lançar Seu próprio ResourceManager. Claro, isso não é uma coisa trivial, mas é isso que o requisito implica. Se o sistema subjacente não fornecer recursos transacionais, o gerenciador de recursos personalizado poderá usar a transação de compensação para reverter (por exemplo, um gerente em uma parte superior do sistema de arquivos pode usar "Excluir pasta" como transação compensadora contra a transação original de "Create Pasta") .
Outras dicas
Talvez você esteja procurando Prevalência do sistema.
Basicamente, toda transação é diário (Os detalhes da transação são salvos) e, se o aplicativo travar e for reiniciado, você poderá pegar de onde parou ou reverter as alterações com base no estado do diário.
Aqui está um link para o Padrão de instantâneo Isso pode ajudá -lo a implementar a prevalência do sistema.