Версия источника: 4880e8b4372c96001c2e052be28b68a95d31252b
Синхронизировано: 2026-11-09T11:15:07.649Z
Источник: https://github.com/sergey-from-riders/vibecoding-base/tree/4880e8b4372c96001c2e052be28b68a95d31252b

<a id="frameworks-laravel-jobs"></a>

# Laravel: транзакция и afterCommit

## Коротко

Задание, которое читает новую запись, отправляйте после фиксации транзакции.

## Плохо

```php
DB::transaction(function () use ($data) {
  $order = Order::create($data);
  SendReceipt::dispatch($order->id);
});
```

## Хорошо

```php
DB::transaction(function () use ($data) {
  $order = Order::create($data);
  SendReceipt::dispatch($order->id)->afterCommit();
});
```

## Почему

Worker может начать работу до commit. При rollback уведомление о несуществующем заказе не должно отправиться.

## Когда применять

Laravel 12.x и асинхронная очередь. Плохой пример предполагает `after_commit=false` в конфигурации соединения. При `after_commit=true` Laravel уже откладывает отправку до commit; явный `afterCommit()` тогда не обязателен. `afterCommit()` не гарантирует доставку при падении процесса между commit и отправкой; для такой гарантии нужен outbox. Обработчик всё равно должен переносить повторы.

## Человек

Определяет необходимую гарантию доставки и срок уведомления.

## Агент

Настраивает afterCommit, идемпотентность и проверку rollback; для надёжной доставки реализует outbox.

## Пример применения

После создания заказа квитанция ставится в очередь. Её ключ уникальности — идентификатор заказа и тип уведомления; временная ошибка почты допускает повтор.

## Как проверить

- Rollback не создаёт отправку.
- Повтор задания не отправляет вторую квитанцию.

## Источники

- [Queues](https://laravel.com/docs/12.x/queues)
- [Database: Getting Started](https://laravel.com/docs/12.x/database#database-transactions)

Уровень: Рекомендуется. Проверено: 2026-11-09. Изменено: 2026-11-09.

[Исходный файл](https://github.com/sergey-from-riders/vibecoding-base/blob/4880e8b4372c96001c2e052be28b68a95d31252b/registry/standards/frameworks/platforms/rules/laravel-jobs.md)
