Одновременное обновление строки

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

ТАБЛИЦА:

  • первая команда
  • вторая_команда
  • first_team_points
  • second_team_points

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

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

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

Я ошибаюсь? Мне нужно что-то настроить? Не вызовет ли второй запрос обновления тупик?

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

Если все это в одной таблице, вы не рискуете попасть в тупик.

Luca Lupidi 08.12.2018 09:35

@LucaLupidi - классический пример взаимоблокировки может возникнуть при использовании пары строк в одной таблице.

Rick James 08.12.2018 21:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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 секунд; его редко удается достичь.)

Другие вопросы по теме