Обновление строки одновременно - PullRequest
0 голосов
/ 08 декабря 2018

Представьте, что у меня есть таблица с двумя столбцами, в которой есть регистр очков от двух разных команд, как показано ниже:

TABLE:

  • first_team
  • second_team
  • first_team_points
  • second_team_points

Таблица имеет соотношение двух команд и очков, которые они получают, когда они заканчивают уровень в течение определенного периода времени.

Обе команды могут играть на уровне, когда они хотят, и обновлять свои очки, когда они заканчивают.Поэтому возможно, что они обновляют свой собственный столбец точек одновременно.Например, команда A обновляет first_team_points, а команда B обновляет second_team_points.

Я знаю, что InnoDB имеет блокировку на уровне строк, поэтому я предполагаю, что в этом случае два обновления будут реализованы в последовательном порядке.

Я не прав?Нужно ли что-то настраивать?Приведет ли второй запрос на обновление к тупику?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 декабря 2018

Пожалуйста, предоставьте код для критики.Между тем, в общем ...

BEGIN;   -- start the transaction
SELECT ... FOR UPDATE;  -- if you need to look at something before updating
...
INSERT/UPDATE/etc   -- make whatever changes
COMMIT;

Есть несколько проблем:

  • Требуется целостность данных;транзакции очень помогают.
  • Вы хотите избежать взаимоблокировок - без дополнительной информации я не могу гарантировать, что все взаимоблокировки будут предотвращены.Будьте готовы повторно выполнить транзакцию, если получите тупик.
  • Одно соединение может получить «lock_wait_timeout».Думайте об этом как о тупике, который может быть решен с помощью ожидания одного из претендентов.Но, если другое соединение занимает слишком много времени, вы можете отключиться.Этого обычно можно избежать, заставляя вещи работать быстрее.(50 секунд - это время ожидания по умолчанию; редко бить его.)
...