Mysql

更新會鎖定行還是整個表?

  • July 20, 2020

基本問題:當我更新數據庫表中的一行時,它會鎖定目前行還是整個表?

我正在使用 MySQL。當我更新不唯一的列時。

鎖定從一個數據庫引擎到另一個不同嗎?我已經閱讀了這篇文章,但我仍然感到困惑。

連結進入血腥細節,但這個問題似乎需要一個簡單的是/否答案。

對於ENGINE=MyISAMor MEMORY,唯一的鎖是表鎖。

對於ENGINE=InnoDB

可以這樣想——它鎖定了它必須查看的每一行。

  • 列上沒有索引——它必須檢查每一行,所以所有行都被鎖定。這有效地鎖定了整個表。
  • UNIQUE列上的索引——只需要觸摸一行,因此被鎖定。
  • 介於兩者之間…列上的非唯一性INDEX- 它必須鎖定具有該值的所有行。(可能“下一個”行也會被鎖定。)

PS:PRIMARY KEY是 MySQL 中的一個UNIQUE索引。

其他一些供應商有不同的索引定義,有些確實有“表鎖”。有些人將一堆行鎖“升級”為“表鎖”。

底線:

  • 根據需要添加一個INDEXUNIQUE或者不添加。
  • 如果您需要先查看該行UPDATEing,請使用事務和SELECT ... FOR UPDATE.

引用自:https://dba.stackexchange.com/questions/271197