2

在 mysql 中,我们使用 @ 表示用户定义的变量,该变量在连接关闭之前一直保持活动状态。在java中,当多个线程共享一个连接池,同时调用一个存储过程来获取排名时:

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

如果 2 个线程同时调用该过程,而不同步 @rank,@rank 是否可能返回意外结果?

有没有更好的方法来处理这种情况?

谢谢!

4

1 回答 1

2

您是否得到“意外结果”取决于您的期望,从您的问题中我不清楚。

您是否尝试将变量隔离到特定连接,或者将其作为共享计数器递增?

用户定义变量的范围仅限于单个连接,并且每个连接将在任何给定时间由单个线程使用,因此在您的示例中,您应该期望该值在每个连接中被隔离。由于您在代码中将值重新初始化为 0,因此您不应该看到之前使用该连接的单独进程的任何残余影响。

但是,既然您说您使用的是存储过程,我建议您在存储过程中声明一个局部变量并使用它而不是用户定义的变量。

局部变量的作用域将限定为存储过程,因此您不必担心当前值会影响以后的线程重用连接。

于 2012-02-13T18:46:36.233 回答