连接池中mysql用户定义的变量并发?

时间:2012-02-13 15:43:27

标签: mysql variables concurrency user-defined

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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