Я хотел использовать транзакции Postgres с библиотекой amp/postgres, поэтому я написал этот код:
Код: Выделить всё
public static function getNewPromocodeAndSetSentParameter(array $data, ?Cancellation $cancellation): ?string {
$data['order'] = self::getPromocodeSort($data['promo_code_list_id']);
$transaction = Postgres::get(Postgres::TYPE_WRITE)->connection()->beginTransaction();
try {
$query = $transaction->execute("WITH deleted_code AS (
DELETE FROM promo_codes
WHERE id = (
SELECT id FROM promo_codes
WHERE promo_code_list_id = :promo_code_list_id
ORDER BY id {$data['order']} LIMIT 1
)
RETURNING id, shop_id, promo_code_list_id, code, client_id, source_type, source_id
)
INSERT INTO sent_promo_codes (id, shop_id, promo_code_list_id, code, client_id, source_type, source_id, sent_date)
SELECT id, shop_id, promo_code_list_id, code, :client_id, :source_type, :source_id, now() FROM deleted_code
RETURNING code", $data);
$code = $query->fetchRow();
$transaction->commit();
return $code['code'];
} catch (\Throwable $e) {
$transaction->rollback();
throw $e;
}
}
Код: Выделить всё
The transaction has been committed or rolled back in /.../vendor/amphp/sql-common/src/ConnectionTransaction.php:321
Подробнее здесь: https://stackoverflow.com/questions/790 ... ansactions
Мобильная версия