我打算编写以下查询:
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表吗?
operations
MySQL是否有可能顺序执行两个子查询,这在某些情况下(如果在该时间范围内添加了新操作)会导致total_points和count_operations不一致?
total_points
count_operations
MyISAM仍使用表级锁。
这些存储引擎通过始终在查询开始时一次请求所有需要的锁并始终以相同顺序锁定表来避免死锁。权衡是该策略减少了并发性。其他要修改表的会话必须等待,直到当前DML语句完成。
因此,其他想要更新正在使用的表的进程必须等到事务完成为止。如果它在表“ operations”上设置了读取锁,则所有后续的写入锁都将进入队列并等待。