O local em que estou trabalhando está tentando estabelecer algumas regras básicas, e o debate que estamos tendo agora é sobre bibliotecas locais versus serviços web para reutilização de código. Os serviços da Web parecem ser a escolha popular na maioria das empresas, e é para isso que a maioria dos desenvolvedores aqui está se inclinando.
Eu simplesmente não consigo ver como você pode usar efetivamente os serviços da Web para qualquer trabalho sério. Como executar com segurança várias chamadas de serviço se não posso usar uma transação?
Digamos que eu tenha um trabalho cron que agarre clientes do nosso banco de dados que atendam a uma determinada condição da qual precisam ser notificados. Eles recebem um fax, um email e um ticket é criado para rastrear o problema internamente. São três chamadas de serviço diferentes que aconteceriam para cada cliente em um loop for.
Se ocorrer um erro em qualquer lugar, é possível que, por exemplo, um fax e email sejam enviados ao cliente, mas um ticket não seja criado. Ou pior, esse trabalho cron pode conter um bug que faz com que falhe sempre no mesmo ponto e envia por e-mail repetidamente o mesmo cliente. Se as bibliotecas fossem todas locais, tudo poderia ser envolvido em uma transação e nada disso aconteceria. Mas estamos usando serviços da web neste exemplo.
Observe que os métodos de email e fax realmente inserem os dados nas tabelas de filas suportadas pelo banco de dados, que por sua vez são tratadas por um processo de tarefa cron separado. Portanto, as chamadas para os métodos de serviço "enviar email" e "enviar fax" podem ser canceladas sem efeito colateral, se necessário.
Uma opção é colocar todo esse pedaço de código no serviço da Web, para que o próprio serviço chame os métodos de criação de email, fax e ticket em uma transação. Mas então estamos criando um método de serviço da Web apenas para o uso de uma transação; não há razão válida para precisarmos chamar esse método de qualquer lugar, exceto esse script cron.
Como você geralmente lidaria com esse método?