[英]mysql innodb table lock - when update one line block update on another line
[英]Does a general InnoDB UPDATE lock the entire table and block incoming specific UPDATEs?
假设我运行了这条语句:
UPDATE Employees set country='AU'
在 InnoDB 表 Employees 上,大约有 1000 万行。
其他用户也通过 SQL 查询积极更新此表,如下所示:
例如,ID = 20 的用户将其国家/地区更改为 NZ:
UPDATE Employees set country='NZ' where id = 20
是的,第一次更新会在表中的所有记录上放置独占锁,阻止其他查询更新它。 锁一直持有到事务被提交。
不会。锁在事务运行时保持,在事务提交时释放。 您可能希望分块更新表,而不是一次性更新表,避免第一次更新锁定整个表。 或者,如果可能,在工作时间之外执行更新。
让我们“跳出框框思考”......
有 2 列。 一个与counter
; 一个 ( dy
) 与计数器最后一次递增的DATE
。 然后使计数器的碰撞稍微复杂一些——也就是说,如果日期早于今天,则将其重置为 1。 还(总是)将日期更新为CURDATE()
。
就像是
UPDATE t
SET counter = IF (dy = CURDATE(), counter + 1, 1),
dy = CURDATE()
WHERE id = 123
这消除了每晚的大更新。
要获取当天的计数器,
SELECT IF (dy = CURDATE(), counter, 0) AS counter
WHERE id = 123;
这种技术还避免了必须在午夜时分运行大更新。 如果机器碰巧在午夜停机(并且当天无法运行更新),则会出现二阶“错误”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.