在mysql中,我们使用@作为用户定义的变量,该变量在连接关闭之前保持活动状态。在java中,当多个线程共享一个连接池时,同时调用存储过程以获得排名:
BEGIN
SET @rank := 0;
SELECT @rank := @rank + 1 as rank FROM ...
END
如果2个线程同时调用该过程,而没有同步@rank,是否有可能@rank会返回意外结果?
有没有更好的方法来处理这种情况?
谢谢!
答案 0 :(得分:1)
您是否得到“意外结果”取决于您的期望,我的问题并不清楚。
您是尝试将变量隔离到特定连接,还是将其作为共享计数器递增?
用户定义变量的范围仅限于单个连接,并且每个连接将在任何给定时间由单个线程使用,因此,对于您的示例,您应该期望在每个连接中隔离该值。由于您在代码中将值重新初始化为0,因此您不应该看到先前使用该连接的单独进程的任何残留影响。
但是,由于您说您正在使用存储过程,我建议您在存储过程中声明一个局部变量,并使用它而不是用户定义的变量。
局部变量将作用于存储过程,因此您不必担心影响以后线程重新使用连接的当前值。