Есть ли ограничение на ВЫБОР ДЛЯ ОБНОВЛЕНИЯ в MySQL?

#mysql

#mysql

Вопрос:

В нашем приложении мы используем оператор SELECT FOR UPDATE, чтобы обеспечить блокировку для наших объектов из других потоков. Один из наших оригинальных архитекторов, который реализовал эту логику, поместил комментарий в нашей wiki, что MySQL имеет ограничение в 200 для операторов select for update. Я не смог найти ничего подобного нигде в Интернете. Кто-нибудь знает, верно ли это, и если да, то есть ли какой-либо способ увеличить ограничение?

Комментарии:

1. Если ваш разработчик не может указать источник для этого утверждения, у меня такое ощущение, что информация является ложной. Попробуйте использовать более высокий предел, чтобы узнать. В качестве примечания, все, что блокирует строки, обычно является плохим планом, поэтому постарайтесь разработать свой код, чтобы избежать этого, когда это возможно. Используйте атомарные инструкции update .

2. У нас есть некоторые зависимости для разных событий рабочего процесса, и чтобы гарантировать, что другое событие рабочего процесса для того же кандидата не будет запущено до завершения предыдущего, мы создаем запись для этого кандидата в таблице и выдаем Select для обновления с идентификатором кандидата. Таким образом, любые другие события для того же кандидата должны дождаться завершения этого. Мы считываем эти события из очереди JMS, и максимальное значение установлено равным 200, потому что, по-видимому, Select для обновления имеет некоторый предел в 200, который я пытаюсь выяснить, почему и можно ли его увеличить

3. Таким образом, мы не можем масштабировать более 200 одновременных запросов в любой момент времени, что создает проблему при пиковом объеме.

4. «по-видимому, Select для обновления имеет некоторый предел 200» не является обоснованным утверждением. Если вы не сможете получить это из исходного кода или доказать это экспериментально, я не поверю, что это правда, и вам следует это игнорировать. То, что все ваше приложение было спроектировано с учетом этого недоказанного ограничения, также вызывает беспокойство.

Ответ №1:

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

В некоторых системах баз данных эта проблема может серьезно повлиять на целостность базы данных. Чтобы предотвратить проблему параллелизма, некоторые системы управления базами данных, такие как SQL Server и MySQL, в большинстве случаев используют блокировку для предотвращения возникновения серьезных проблем с целостностью данных.

Эти блокировки задерживают выполнение зафиксированной транзакции, если она конфликтует с транзакцией, которая уже запущена.

В SQL Server или MySQL запросы SELECT ДЛЯ ОБНОВЛЕНИЯ используются, когда транзакция зафиксирована или откатывается.

Однако в MySQL записи транзакций распределяются по отдельным серверам MySQL для минимального общего количества транзакций в кластере.

MySQL использует высокоуровневый алгоритм базы данных, который составляет эту формулу:

TotalNoOfConcurrentTransactions = (максимальное количество таблиц, к которым осуществляется доступ в любой отдельной транзакции 1) * количество узлов SQL. Каждый узел данных может обрабатывать TotalNoOfConcurrentTransactions / количество узлов данных. Каждая сетевая база данных (NDB) Кластер имеет 4 узла данных.

Результат приведенной выше формулы выражается как MaxNoOfConcurrentTransactions / 4.

В документации MySQL они предоставили пример с использованием 10 узлов SQL, использующих кластер из 10 таблиц в транзакции 11, что привело к 275 транзакциям MaxNoOfConcurrentTransactions.

ОГРАНИЧЕНИЕ в ВЫБОРЕ ДЛЯ ОБНОВЛЕНИЯ, возможно, используется для количества строк, затронутых во время обновления.

Я не уверен, вероятно, ваши архитекторы использовали рисунок выше в соответствии с документацией MySQL.

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

https://dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxnoofconcurrentoperations

Комментарии:

1. У нас нет кластеризованного MySQL. Это всего лишь один сервер MySQL.