更新会锁定该行还是整个表?

Els*_*yed 4 mysql locking update

基本问题:当我更新数据库表中的一行时,它会锁定当前行还是整个表?

我正在使用MySQL。当我更新不唯一的列时。

一种数据库引擎与另一种数据库引擎的锁定是否不同?我读过这篇文章,但我仍然很困惑。

Ric*_*mes 5

这些链接涉及血淋淋的细节,但这个问题似乎需要一个简单的是/否的答案。

对于ENGINE=MyISAMor MEMORY,唯一的锁是表锁。

为了ENGINE=InnoDB

可以这样想——它锁定它必须查看的每一行。

  • 列上没有索引——它必须检查每一行,因此所有行都被锁定。这有效地锁定了整个表。

  • UNIQUE列上的索引——只需要触及一行,因此被锁定。

  • 在两者之间...列上的非唯一性INDEX——它必须锁定具有该值的所有行。(可能“下一行”也会被锁定。)

PS:这PRIMARY KEYUNIQUEMySQL中的索引。

其他一些供应商有不同的索引定义,有些确实有“表锁”。有些将一堆行锁“升级”为“表锁”。

底线:

  • 根据需要添加INDEXUNIQUE不添加 。
  • 如果您需要查看可能位于UPDATEing其之前的行,请使用事务 和SELECT ... FOR UPDATE