INSERT / UPDATE查询中的多个MySQL子查询的原子性?

时间:2012-12-02 19:02:43

标签: 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不一致?< / p>

1 个答案:

答案 0 :(得分:1)

MyISAM仍使用table-level locks

  

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

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