自定义变量mysql多语句查询中的竞态条件?

zaqlnxep  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(330)

下面是从node.js运行的多查询

SET @var = 123;
INSERT INTO `table` VALUES ('test', @var)
  ON DUPLICATE KEY UPDATE 
    column = @var := IF(column < @var, @var, column + @var);
SELECT @var column;

对并发查询有什么警告吗?
如果多个线程共享同一个连接(会话)?

qni6mghb

qni6mghb1#

不要在多个线程上共享mysql连接。你会造成比赛条件。每个线程都可以(而且不可避免地)接收在另一个线程上启动的查询的结果,这是不可预测的。最后,每个线程都会收到它想要的数据包的一个不可理解的子集,再加上它不想要的额外数据包。
另外,您提到了multi query,但也不应该使用它。每次调用执行一条语句。如果您的网络接近合理的性能,那么使用多查询没有任何好处。
可以肯定的是,在单独调用query()时,设置或读取示例中显示的用户定义变量是可靠的,只要您在同一个连接上这样做。
对于node.js,默认情况下每个请求只允许一条语句。您可以启用 multipleStatements 如果需要,请参阅node mysql multiple statement in one query。
另一种方法是一次运行一条语句,然后串行运行它们。您可以确保下一条语句等待前一条语句完成,方法是在前一条语句的回调函数中运行它。一个例子显示在op的question in node mysql multiple statement in one query中。

相关问题