Где проходят границы транзакции в сервисном коде и что нельзя делать внутри?
Транзакция обязана быть короткой и содержать только работу с базой. Внутрь нельзя помещать три вещи. Сетевые вызовы: платёжный шлюз, отправка письма, обращение к другому сервису — они длятся секунды и всё это время держат блокировки и горизонт видимости. Ожидание пользователя: транзакция не может пережить показ формы подтверждения. Публикацию событий напрямую в брокер: она не откатится вместе с базой, поэтому используют outbox. Границу проводят на уровне сценария: сервисный метод открывает транзакцию, делает согласованное изменение и коммитит; всё, что после — вне её. При этом транзакция должна быть повторяемой: сериализационные конфликты и дедлоки лечатся повтором, а значит, сценарий обязан быть идемпотентным — иначе повтор создаст второй платёж. Отдельное правило: не открывать вложенные транзакции ради «атомарности внутри атомарности», а использовать точки сохранения там, где нужен частичный откат.