我打算编写以下查询:
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_points
和count_operations
不一致?< / p>
答案 0 :(得分:1)
MyISAM仍使用table-level locks。
这些存储引擎通过始终请求所有需要来避免死锁 在查询开始时立即锁定并始终锁定 表格顺序相同。权衡是这种策略减少了 并发性;其他想要修改表的会话必须等待 直到当前的DML语句结束。
因此,其他想要更新您正在使用的表的进程必须等到您的事务完成。如果它对表“operations”设置了读锁定,则所有后续写锁定都会进入队列并等待。