将 mysql 在处理时锁定所有 table
will mysql lock all table while processing
众所周知,Innodb引擎支持行(记录)锁。
毫无疑问下面的sql是原子的,在一个事务中
update tableA t
set t.oneField = someValue
where t.primaryKey = id
但我对下面的情况感到困惑(没有where条件)
update tableA t
set t.oneField = someValue
我想问的是,执行这个sql的时候,会不会mysql锁住整个table?
更具体地说,当 rowA 已被处理并且 mysql 正在处理其他行时,当此 sql 仍在处理 时 rowA 是否仍然被锁定?
任何工具或 sql 命令都可以用来知道 rowB 是否被锁定?
我已经阅读了文档 https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html,但仍然感到困惑。
另外,如果可以的话,能不能给个具体的案例或者demo或者实验来说明一下你的结论。我自己能做的事情都可以。
非常感谢。
说 "lock the table" 技术上 不正确。实际上,它 "locks every row"。对用户来说这些感觉是一样的。
您的两个查询都会尝试 运行,但它们很快就会相互干扰。 可能一个会延迟到另一个完成。在 一些 情况下,将检测到 "deadlock" 并且一个查询将被中止。 (您必须测试错误。)
与前任(ENGINE=MyISAM
)的重要区别在于所有操作"locked the table"。在更新另一行的单独线程完成之前,无法开始更新一行。而且,UPDATE
和SELECT
之间的干扰更大。
使用 InnoDB,单独行的更新可以同时发生,并且选择也可以在更新发生的同时进行。
众所周知,Innodb引擎支持行(记录)锁。 毫无疑问下面的sql是原子的,在一个事务中
update tableA t
set t.oneField = someValue
where t.primaryKey = id
但我对下面的情况感到困惑(没有where条件)
update tableA t
set t.oneField = someValue
我想问的是,执行这个sql的时候,会不会mysql锁住整个table? 更具体地说,当 rowA 已被处理并且 mysql 正在处理其他行时,当此 sql 仍在处理 时 rowA 是否仍然被锁定? 任何工具或 sql 命令都可以用来知道 rowB 是否被锁定?
我已经阅读了文档 https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html,但仍然感到困惑。
另外,如果可以的话,能不能给个具体的案例或者demo或者实验来说明一下你的结论。我自己能做的事情都可以。
非常感谢。
说 "lock the table" 技术上 不正确。实际上,它 "locks every row"。对用户来说这些感觉是一样的。
您的两个查询都会尝试 运行,但它们很快就会相互干扰。 可能一个会延迟到另一个完成。在 一些 情况下,将检测到 "deadlock" 并且一个查询将被中止。 (您必须测试错误。)
与前任(ENGINE=MyISAM
)的重要区别在于所有操作"locked the table"。在更新另一行的单独线程完成之前,无法开始更新一行。而且,UPDATE
和SELECT
之间的干扰更大。
使用 InnoDB,单独行的更新可以同时发生,并且选择也可以在更新发生的同时进行。