2012-02-13 72 views
0

在mysql中,我們使用@作爲用戶定義變量,它在連接關閉之前保持活動狀態。在java中,當多個線程共享一個連接池,同時調用存儲過程同時獲得排名:連接池中的mysql用戶定義變量併發性?

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

如果兩個線程都在調用同一時間的程序,無需同步@rank,這可能@rank可能返回意外的結果?

有沒有更好的方法來處理這種情況?

謝謝!

回答

0

您是否得到「意想不到的結果」取決於您的期望,這對我而言並不清楚。

你想將變量隔離到一個特定的連接,或增加它作爲共享計數器?

用戶定義變量的作用域限於單個連接,並且每個連接將在任何給定時間由單個線程使用,因此對於您的示例,您應該期望在每個連接中將值隔離。由於您正在將代碼中的值重新初始化爲0,因此您不應該看到之前使用該連接的單獨進程的任何殘留影響。

但是,既然你說你使用的是存儲過程,我建議你在存儲過程中聲明一個局部變量,並使用它來代替用戶定義的變量。

局部變量的作用域將被存儲到存儲過程中,因此您不必擔心影響後面的線程重新使用連接的當前值。

+0

感謝您的回答。其實我試過使用局部變量。但是當我編碼'SET rank:= 0; SELECT rank:= rank + 1 ...'它給了我錯誤,說'rank:= rank + 1'是錯誤的,因爲':='不被支持。不知道爲什麼。 – Lee 2012-02-13 20:57:45