С этой вот стратегией, у меня правда еще вопрос возник. Вот у нас разные модули, эксепшены уникальности должны быть внутри этих модулей. Но транзакция то будет снаружи этих модулей, а значит и обработка и создание своих экзепшенов (как показал Валентин), то же где то - выше. Банально тот же flush.
$repo->perist($aggr1);
$repo2->persist($aggr2);
flush();
Ошибка то появится в flush(), который вообще вне всех модулей; И где тут делать свои Exception уникальности?
Это получается надо отказываться от нативной транзакции, сохранять внутри репозиториев отдельно каждый агрегат, а если что то пошло не так, то удалять предудыщие записи (которые уже были созданы), грубо говоря имитируя транзакцию?