众所周知,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,但仍感到困惑。
更重要的是,如果有可能,您能否给我一个特定的案例或演示或实验来说明您的结论。我自己也可以做的事情都可以。
非常感谢。
答案 0 :(得分:0)
说不会"锁定表"正在技术上正确。实际上,它会锁定每一行"。对用户来说,这些感觉一样。
您的两个查询都会尝试运行,但很快就会相互干扰。 可能会延迟到另一个完成。在某些情况下,"死锁"将被检测到,一个查询将被中止。 (您必须测试错误。)
与前任(ENGINE=MyISAM
)的重要区别在于所有操作都锁定了表格#34;。在更新另一行的单独线程完成之前,无法更新一行。而且,UPDATE
和SELECT
之间的干扰更大。
使用InnoDB,可以同时进行单独行的更新,并且在更新发生时也可以进行选择。