这些链接涉及血淋淋的细节,但这个问题似乎需要一个简单的是/否的答案。
对于ENGINE=MyISAM
or MEMORY
,唯一的锁是表锁。
为了ENGINE=InnoDB
:
可以这样想——它锁定它必须查看的每一行。
列上没有索引——它必须检查每一行,因此所有行都被锁定。这有效地锁定了整个表。
UNIQUE
列上的索引——只需要触及一行,因此被锁定。
在两者之间...列上的非唯一性INDEX
——它必须锁定具有该值的所有行。(可能“下一行”也会被锁定。)
PS:这PRIMARY KEY
是UNIQUE
MySQL中的索引。
其他一些供应商有不同的索引定义,有些确实有“表锁”。有些将一堆行锁“升级”为“表锁”。
底线:
INDEX
或UNIQUE
不添加 。UPDATEing
其之前的行,请使用事务 和SELECT ... FOR UPDATE
。