会在处理时mysql锁定所有表

时间:2017-04-17 12:53:22

标签: mysql database locking innodb

众所周知,Innodb引擎支持行(记录)锁定。 毫无疑问,以下sql是原子的并且在事务中。

update tableA t 
set t.oneField = someValue 
where t.primaryKey = id

但我对以下情况感到困惑(没有条件

update tableA t 
set t.oneField = someValue

我想问的是,mysql会在执行这个sql时锁定整个表吗? 更具体地,当处理rowA并且mysql正在处理其他行时,rowA仍处于锁定状态,而此sql仍在处理? 任何工具或sql命令都可以用来知道rowB是否被锁定?

我已阅读文档perlsub#Prototypes,但仍感到困惑。

更重要的是,如果有可能,您能否给我一个特定的案例或演示或实验来说明您的结论。我自己也可以做的事情都可以。

非常感谢。

1 个答案:

答案 0 :(得分:0)

说不会"锁定表"正在技术上正确。实际上,它会锁定每一行"。对用户来说,这些感觉一样。

您的两个查询都会尝试运行,但很快就会相互干扰。 可能会延迟到另一个完成。在某些情况下,"死锁"将被检测到,一个查询将被中止。 (您必须测试错误。)

与前任(ENGINE=MyISAM)的重要区别在于所有操作都锁定了表格#34;。在更新另一行的单独线程完成之前,无法更新一行。而且,UPDATESELECT之间的干扰更大。

使用InnoDB,可以同时进行单独行的更新,并且在更新发生时也可以进行选择。