2015-10-20 4 views
1

У меня есть node.js-сервер, который использует пул соединений node-mysql для запроса базы данных MySQL.Как предотвратить переменные MySQL, определяемые пользователем, столкновение

Мне нужно сделать запрос SELECT, который использует пользовательскую переменную для добавления суммы предыдущих строк. Перед запросом, я SET переменных для инициализации в 0.

SET @sum:=0; 
SELECT *, @sum := @sum + `value` AS SUM FROM `table`; 

Запрос работает как ожидался, но я волнуюсь, что произойдет, если есть несколько запросов на мой сервер узла одновременно. Сервер выполнит несколько запросов. Будут ли они сталкиваться друг с другом и влиять друг на друга, каждый из которых увеличивает одну и ту же переменную? И если да, как я могу это предотвратить?

В лучшем случае сценарий должен ограничивать область действия переменной только одним запросом SELECT. Это позволило бы удалить заявление SET и обернуть @sum в ISNULL. Таким образом, результат будет

SELECT *, @sum := ISNULL(@sum,0) + `value` AS SUM FROM `table`; 

Но я не знаю, как ограничить сферу так что в конце этого запроса @sum остается на конечное значение и для следующего запроса, это не null и так Безразлично 't увеличивать с 0 снова.

В любом случае, я могу просто оставить SET, но вам нужно убедиться, что несколько запросов, использующих одно и то же соединение, не влияют друг на друга. Я не знаю, как именно MySQL обрабатывает запросы, поэтому, возможно, это даже не проблема, но я должен быть уверен.

Благодарим за помощь!

ответ

2

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

Однако, вы можете написать запрос, используя только одно заявление:

SELECT t.*, @sum := @sum + `value` AS SUM 
FROM `table` t CROSS JOIN 
    (SELECT @sum := 0) params; 

MySQL делает гарантию того, что положение FROM оценивается до SELECT, так что это инициализирует переменную перед ее использованием.

Смежные вопросы