Как использовать amphp с транзакциями Postgres?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как использовать amphp с транзакциями Postgres?

Сообщение Anonymous »

Мой код выполняется внутри работника, поэтому он выполняется параллельно.
Я хотел использовать транзакции 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»