mysql пользовательских переменных параллелизма в пуле соединений? - PullRequest
1 голос
/ 13 февраля 2012

В mysql мы используем @ для пользовательской переменной, которая остается активной до тех пор, пока соединение не будет закрыто. В Java, когда несколько потоков совместно используют один пул соединений, одновременно вызывая хранимую процедуру для получения ранжирования:

BEGIN
  SET @rank := 0;
  SELECT @rank := @rank + 1 as rank FROM ...
END

Если 2 потока вызывают процедуру одновременно, без синхронизации @rank, возможно ли, что @rank может вернуть неожиданный результат?

Есть ли лучший способ справиться с этой ситуацией?

Спасибо!

1 Ответ

1 голос
/ 13 февраля 2012

Получите ли вы "неожиданные результаты" или нет, зависит от того, что вы ожидаете, что мне не ясно из вашего вопроса.

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

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

Однако, поскольку вы сказали, что используете хранимую процедуру, я рекомендую вам объявить локальную переменную внутри хранимой процедуры и использовать ее вместо пользовательской переменной.

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

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