Заказ и сделка в CRM расходятся: HTTP-вызов внутри транзакции
DB::transaction(function () use ($order) {
$order->save();
$this->crm->createDeal($order); // внешний HTTP-запрос
});
По отчётам расхождение: иногда сделка в CRM есть, а заказа в вашей базе нет; иногда наоборот. Что действительно решает проблему?
- Перенести вызов CRM в начало транзакции: если база потом откажет, сделка уже создана, и расхождение закроется ручной сверкой
- Обернуть вызов CRM в try/catch и при ошибке выполнять компенсирующее удаление сделки — этого достаточно при любых сбоях процесса
- Сохранять в одной транзакции заказ и запись-задание на отправку (outbox), а вызывать CRM отдельным воркером с повторами и ключом идемпотентности
- Использовать распределённую транзакцию XA между вашей базой и HTTP-API партнёра: двухфазный коммит обеспечит атомарность
