2012-02-13 2 views
0

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

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

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

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

Спасибо!

ответ

0

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

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

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

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

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

+0

Спасибо за ваш ответ. На самом деле я попытался использовать локальные переменные. Но когда я кодирую 'SET rank: = 0; SELECT rank: = rank + 1 ... 'это дает мне ошибку, говоря, что' rank: = rank + 1 'неверно, потому что': = 'не поддерживается. Не знаю, почему. – Lee