Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer

Mysql заблокировать транзакцию по foreign key?

Здравствуйте. Есть код, на php + laravel + mysql, который за сценой выполняет транзакцию в mysql:
DB::transaction(function () use (&$game, &$bet, $items, $user) {
	$bet->user()->associate($user);
	$bet->game()->associate($game);
	$bet->save();
	$this->inventoryService->move($items, $bet);
	$game->save();
});


Собственно в таблице bets есть поле game_id с foreign key на таблицу games. Можно ли сделать так, что-бы во время лока таблицы games, другой транзакцией, первая выкидывала ошибку?

Нужно так:
game_transaction2 start
bet_transaction1 start
bet_transaction1 ERROR

А сейчас так:
game_transaction2 start
bet_transaction1 start
bet_transaction2 stop success
game_transaction2 stop success
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 1
AlexMaxTM
@AlexMaxTM
Честно говоря, не понятно зачем нужно выходить с ошибкой. Если первая транзакция еще выполняется, то вторая просто дождется ее выполнения и сработает позже. С точки зрения СУБД ошибки нет никакой, потому ее нельзя перехватить. Ошибка может возникнуть, если только возник "тупик" (deadlock), тогда одна из транзакций остреливается и можно получить об этом сообщение от СУБД.
Но если очень хочется получить сообщение, тогда проверьте сначала не залочена ли таблица перед запуском транзакции, и если это так, выдайте сообщение, и не запускайте транзакцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы