[英]Atomicity multiple MySQL subqueries in an INSERT/UPDATE query?
我打算編寫以下查詢:
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
不一致?
MyISAM仍使用表級鎖 。
這些存儲引擎通過始終在查詢開始時一次請求所有需要的鎖並始終以相同順序鎖定表來避免死鎖。 權衡是該策略減少了並發性。 其他想要修改表的會話必須等待,直到當前DML語句完成。
因此,其他想要更新正在使用的表的進程必須等到事務完成為止。 如果它在表“ operations”上設置了讀取鎖,則所有后續的寫入鎖都將進入隊列並等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.