如何防止MySQL用户定义的variables碰撞

我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。

我需要使SELECT用户定义variables的查询添加以前的行的总和。 在查询之前,我将该variables初始化为0。

 SET @sum:=0; SELECT *, @sum := @sum + `value` AS SUM FROM `table`; 

该查询按预期工作,但我担心如果同时有多个请求到我的节点服务器会发生什么。 服务器将进行多个查询。 他们会碰撞和相互影响,每增加一个variables? 如果是的话,我怎么能阻止呢?

最好的情况是将variables的范围限制在一个SELECT查询中。 这将允许我删除SET语句并在ISNULL包装@sum 。 所以结果会是

 SELECT *, @sum := ISNULL(@sum,0) + `value` AS SUM FROM `table`; 

但是我不知道如何限制范围,所以在这个查询结束时, @sum留在最终值,对于下一个查询,它不是null ,所以它不会从0开始递增。

无论如何,我可以保持SET但需要确保使用相同连接的多个查询不会相互影响。 我不知道MySQL如何处理查询,所以这可能不是一个问题,但我需要确定。

感谢您的任何帮助!

您不必担心增加相同数字的不同查询。 不同的查询在不同的线程或进程中运行,并且需要一些工作来让它们共享数据。

但是,只能使用一条语句来编写查询:

 SELECT t.*, @sum := @sum + `value` AS SUM FROM `table` t CROSS JOIN (SELECT @sum := 0) params; 

MySQL确保FROM子句在SELECT之前被计算,因此在使用它之前初始化variables。