Elsayed Asked: 2020-07-19 14:49:12 +0800 CST2020-07-19 14:49:12 +0800 CST 2020-07-19 14:49:12 +0800 CST 更新会锁定行还是整个表? 772 基本问题:当我更新数据库表中的一行时,它会锁定当前行还是整个表? 我正在使用 MySQL。当我更新不唯一的列时。 锁定从一个数据库引擎到另一个不同吗?我已经阅读了这篇文章,但我仍然感到困惑。 mysql update 1 个回答 Voted Best Answer Rick James 2020-07-20T09:06:54+08:002020-07-20T09:06:54+08:00 链接进入血腥细节,但这个问题似乎需要一个简单的是/否答案。 对于ENGINE=MyISAMor MEMORY,唯一的锁是表锁。 对于ENGINE=InnoDB: 可以这样想——它锁定了它必须查看的每一行。 列上没有索引——它必须检查每一行,所以所有行都被锁定。这有效地锁定了整个表。 UNIQUE列上的索引——只需要触摸一行,因此被锁定。 介于两者之间...列上的非唯一性INDEX- 它必须锁定具有该值的所有行。(可能“下一个”行也会被锁定。) PS:PRIMARY KEY是 MySQL 中的一个UNIQUE索引。 其他一些供应商有不同的索引定义,有些确实有“表锁”。有些人将一堆行锁“升级”为“表锁”。 底线: 根据需要添加一个INDEX,UNIQUE或者不添加。 如果您需要先查看该行UPDATEing,请使用事务和SELECT ... FOR UPDATE.
链接进入血腥细节,但这个问题似乎需要一个简单的是/否答案。
对于
ENGINE=MyISAM
orMEMORY
,唯一的锁是表锁。对于
ENGINE=InnoDB
:可以这样想——它锁定了它必须查看的每一行。
列上没有索引——它必须检查每一行,所以所有行都被锁定。这有效地锁定了整个表。
UNIQUE
列上的索引——只需要触摸一行,因此被锁定。介于两者之间...列上的非唯一性
INDEX
- 它必须锁定具有该值的所有行。(可能“下一个”行也会被锁定。)PS:
PRIMARY KEY
是 MySQL 中的一个UNIQUE
索引。其他一些供应商有不同的索引定义,有些确实有“表锁”。有些人将一堆行锁“升级”为“表锁”。
底线:
INDEX
,UNIQUE
或者不添加。UPDATEing
,请使用事务和SELECT ... FOR UPDATE
.