MySQL 使用用户定义变量的多语句查询中的竞争条件?
Race Conditions in MySQL multi statement query with user defined variables?
这是来自 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;
对并发查询有什么注意事项吗?
如果多个线程共享同一个连接(会话)?
切勿在多个线程上共享 MySQL 连接。你会导致竞争条件。每个线程都可以(并且不可避免地)接收在另一个线程上启动的查询的结果,而这种情况的发生是不可预测的。您最终会导致每个线程接收到它想要的数据包的一个难以理解的子集,以及它不需要的额外数据包。
此外,您提到了多查询,但您也不应该使用它。每次调用执行一条语句。如果您的网络性能接近合理,那么使用多查询没有任何优势。
您可以放心,设置或读取用户定义的变量(如示例中所示)在单独调用 query() 时是可靠的,只要您在同一个连接上进行。
关于node.js,默认情况下每个请求只允许一个语句。如果需要,您可以启用 multipleStatements
(参见 node-mysql multiple statement in one query)。
另一种方法是一次运行 一个语句,然后运行 依次进行。您可以确保下一个语句等待前一个语句完成,方法是 运行 在前一个语句的回调函数中设置它。 node-mysql multiple statement in one query.
中 OP 的问题中显示了一个示例
这是来自 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;
对并发查询有什么注意事项吗?
如果多个线程共享同一个连接(会话)?
切勿在多个线程上共享 MySQL 连接。你会导致竞争条件。每个线程都可以(并且不可避免地)接收在另一个线程上启动的查询的结果,而这种情况的发生是不可预测的。您最终会导致每个线程接收到它想要的数据包的一个难以理解的子集,以及它不需要的额外数据包。
此外,您提到了多查询,但您也不应该使用它。每次调用执行一条语句。如果您的网络性能接近合理,那么使用多查询没有任何优势。
您可以放心,设置或读取用户定义的变量(如示例中所示)在单独调用 query() 时是可靠的,只要您在同一个连接上进行。
关于node.js,默认情况下每个请求只允许一个语句。如果需要,您可以启用 multipleStatements
(参见 node-mysql multiple statement in one query)。
另一种方法是一次运行 一个语句,然后运行 依次进行。您可以确保下一个语句等待前一个语句完成,方法是 运行 在前一个语句的回调函数中设置它。 node-mysql multiple statement in one query.
中 OP 的问题中显示了一个示例