繁体   English   中英

一般的 InnoDB UPDATE 是否锁定整个表并阻止传入的特定 UPDATE?

[英]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
  1. 在那种情况下,在一般更新完成之前,是否会阻止对该表的任何进一步更新?
  2. 如果是这样,有没有办法允许特定更新和一般更新同时运行,如果它们不更新同一行? (为了澄清我在这里的意思:假设一般更新完成更新 ID 为 1 - 50 的员工,现在正在更新员工 51 - ~1000 万,对 ID 为 20 的员工的单一更新应该 go 通过而不等待一般更新完成)
  1. 是的,第一次更新会在表中的所有记录上放置独占锁,阻止其他查询更新它。 锁一直持有到事务被提交。

  2. 不会。锁在事务运行时保持,在事务提交时释放。 您可能希望分块更新表,而不是一次性更新表,避免第一次更新锁定整个表。 或者,如果可能,在工作时间之外执行更新。

让我们“跳出框框思考”......

有 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM