Условия гонки в MySQL запрос с несколькими операторами с пользовательскими переменными? - PullRequest
0 голосов
/ 27 июня 2018

Вот несколько запросов, запущенных из Node.js

SET @var = 123;
INSERT INTO `table` VALUES ('test', @var)
  ON DUPLICATE KEY UPDATE 
    column = @var := IF(column < @var, @var, column + @var);
SELECT @var column;

Есть ли какие-либо предостережения по одновременным запросам?

Если совместно использовать одно и то же соединение (сеанс) для нескольких потоков?

1 Ответ

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

Никогда не разделяйте соединение MySQL на несколько потоков. Вы будете вызывать условия гонки. Каждый поток может (и неизбежно получает) получать результаты для запросов, запущенных в другом потоке, и это происходит непредсказуемо. В итоге каждый поток получает непонятное подмножество пакетов, которые он хочет, в сочетании с дополнительными пакетами, которые ему не нужны.

Кроме того, вы упоминаете несколько запросов, но вы также не должны использовать это. Выполните одну инструкцию за вызов. Использование мультизапроса не дает никаких преимуществ, если ваша сеть хоть сколько-нибудь близка к разумной производительности.

Вы можете быть уверены, что установка или чтение пользовательских переменных, которые вы показываете в своем примере, надежны при отдельных вызовах query (), если вы делаете это по тому же соединению.


Что касается node.js, он по умолчанию допускает только одну инструкцию на запрос. Вы можете включить multipleStatements (см. node-mysql несколько операторов в одном запросе ), если хотите.

Альтернатива - запускать операторы по одному и запускать их последовательно. Вы можете убедиться, что следующий оператор ожидает завершения предыдущего, запустив его в функции обратного вызова для предыдущего оператора. Пример показан в вопросе OP в множественном операторе node-mysql в одном запросе .

...