2

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

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

@rank を同期せずに 2 つのスレッドが同時にプロシージャを呼び出している場合、@rank が予期しない結果を返す可能性はありますか?

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

ありがとう!

4

1 に答える 1

2

あなたが「予期しない結果」を得るかどうかはあなたが何を期待するかに依存します、それはあなたの質問から私には明らかではありません。

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

ユーザー定義変数のスコープは単一の接続に制限されており、各接続は常に単一のスレッドによって使用されるため、この例では、値が各接続内で分離されることを期待する必要があります。コードで値を0に再初期化しているため、以前に接続を使用した個別のプロセスの残留効果は見られないはずです。

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

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

于 2012-02-13T18:46:36.233 に答える