2012-02-13 6 views
0

mysqlでは、ユーザー定義変数に@を使用しています。この変数は、接続が閉じられるまで有効です。ランキングを取得するために、同時に、ストアドプロシージャを呼び出し中に複数のスレッドが、1つの接続プールを共有するJava、で:接続プールのmysqlユーザー定義変数の同時実行性?

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

2つのスレッドが同時にプロシージャを呼び出す場合、@rankを同期せずに、それが可能@rank月であります予想外の結果を返しますか?

この状況を処理するより良い方法はありますか?

ありがとうございます!

答えて

0

"予期しない結果"が出るかどうかは、あなたの期待に応じて決まります。これはあなたの質問から私には分かりません。

変数を特定の接続に分離するか、それを共有カウンタとしてインクリメントしますか?

ユーザー定義変数の有効範囲は単一の接続に限定されており、各接続は任意の時点で1つのスレッドによって使用されるため、例では各接続内で値を分離する必要があります。あなたのコードで値を0に再初期化しているので、以前に接続を使用した別々のプロセスの残存効果は見られません。

しかし、ストアドプロシージャを使用していると言われているので、ストアドプロシージャ内にローカル変数を宣言して、ユーザー定義変数の代わりにその変数を使用することをお勧めします。

ローカル変数はストアドプロシージャにスコープされるため、接続を再利用する後のスレッドに影響を与える現在の値を心配する必要はありません。

+0

ありがとうございます。実際に私はローカル変数を使ってみました。しかし、私が 'SET rank:= 0; SELECT rank:= rank + 1 ... 'これは、':= 'がサポートされていないため、' rank:= rank + 1 'が間違っているというエラーが表示されます。理由は分かりません。 – Lee

関連する問題