Situação com begin transaction

Boa tarde Professor,
Imagina que temos duas tabelas:
produto_cliente e estoque_loja
quando o cliente faz uma compra, eu crio um registro em produto_cliente e ao mesmo tempo atualizo o estoque_loja. Nesse caso eu utilizaria o beginTransaction no back end da aplicação, já que se ocorrer algum problema durante o processo eu precisaria dar um "rollback" nos inserts e update.
Gostaria de saber como implementar a lógica de beginTransaction quando mais de uma tabela fosse afetada. Isso ficaria em services? como implementaria com a arquitetura que você montou utilizando os controllers, services e repositories?
Sei que os controllers só terão validações de seus requests, chamadas para services e os seus respectivos retornos. Logo, qual seria a camada mais correta para aplicar o begin e como fazer isso exatamente?
Olá, tudo bem?
Como é algo relacionado a banco de dados (persistência), deixa na camada de repositories.
use Illuminate\Support\Facades\DB;
DB::beginTransaction();
try {
// insere tb1
// insere tb2
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
// assim deixa a excessão subir (poderia até trabalhar com excessão personalizada)
thrown new $e;
}

Mas professor, para eu persistir os dados na tb2 eu acesso via Repository da tb2, não manipulo direto da model da tb2, correto ?
Devo fazer a injeção do Repository da tb2 no Repository da tb1 pelo constructor ?

Entendi, neste caso, você injeta os dois repositórios no seu service.
try {
$this->repository->create($data1);
$this->otherRepository->create($data2);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
// assim deixa a excessão subir (poderia até trabalhar com excessão personalizada)
thrown new $e;
}

Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!