проблема с одновременными обновлениями в моей таблице базы данных - PullRequest
1 голос
/ 27 июня 2019

Разные микросервисы могут одновременно выполнять следующую команду в моей таблице базы данных

> update table_2 set final_date='23123123' where section_id=10  

У section_id может быть 50K строк.Что может пойти не так, если несколько соединений выполняют одну и ту же команду (и одинаковые значения)?Как я могу предотвратить потенциальную проблему?

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Во-первых, в вашем приложении ничего не пойдет не так. (если только вы не превысите максимальное количество соединений, разрешенное базой данных или вашим приложением) Сама база данных будет обрабатывать, не позволяя нескольким соединениям «обновлять» одну и ту же строку «в одно и то же время». Если вы явно не укажете иное в своем выражении SQL, механизмы блокировки по умолчанию заставят ваши многочисленные попытки обновить одну и ту же строку в очередь.

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

Я предлагаю несколько решений, которые уменьшат количество выполненных ОБНОВЛЕНИЙ, но не количество соединений, которые ваше приложение будет использовать с базой данных.

Добавьте больше логики в свой оператор UPDATE - например, обновляйте, только если существующее значение для конечной даты устарело более чем на 5 секунд (или 5 минут, или 5 часов, в зависимости от вашего варианта использования). Это не должно быть большое значение, потому что эти операторы будут выполняться быстро, если их одновременно запросят узлы приложения.

И / ИЛИ оформить заказ "пропустить заблокирован" здесь: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

это, по сути, примет запрос первого узла, а затем все остальные, которые пытаются выполнить обновление, просто останавливаются, если они пытаются выполнить обновление, пока строка заблокирована. Это может занять место приведенной выше логики, но только для запросов, которые происходят, пока строка уже заблокирована предыдущим ОБНОВЛЕНИЕМ.

0 голосов
/ 27 июня 2019

Очевидно, что если команда будет выполняться несколько раз, это вызовет головную боль, потому что вы не получите то, что хотите. Поэтому постарайтесь определить логику до того, как затем применять ее правильно. Например, вы можете принять решение принять только первое поступившее изменение и отменить остальные после их перехвата (вы можете выдать сообщение «запись заблокирована не может быть изменена!») .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...