admin

是否在INSERT / UPDATE查询中存在多个MySQL子查询?

sql

我打算编写以下查询:

INSERT INTO summary (user_id, total_points, count_operations)
SELECT 
   15 AS user_id,
   (SELECT SUM(points) FROM operations WHERE user_id = 15) AS total_points,
   (SELECT COUNT(*) FROM operations WHERE user_id = 15) AS count_operations
ON DUPLICATE KEY UPDATE
total_points = VALUES(total_points), 
count_operations = VALUES(count_operations);

整个陈述是原子的吗?即MySQL(带有MyISAM引擎)内部锁定operations表吗?

MySQL是否有可能顺序执行两个子查询,这在某些情况下(如果在该时间范围内添加了新操作)会导致total_pointscount_operations不一致?


阅读 153

收藏
2021-06-07

共1个答案

admin

MyISAM仍使用表级锁

这些存储引擎通过始终在查询开始时一次请求所有需要的锁并始终以相同顺序锁定表来避免死锁。权衡是该策略减少了并发性。其他要修改表的会话必须等待,直到当前DML语句完成。

因此,其他想要更新正在使用的表的进程必须等到事务完成为止。如果它在表“ operations”上设置了读取锁,则所有后续的写入锁都将进入队列并等待。

2021-06-07