Mysql
更新會鎖定行還是整個表?
基本問題:當我更新數據庫表中的一行時,它會鎖定目前行還是整個表?
我正在使用 MySQL。當我更新不唯一的列時。
鎖定從一個數據庫引擎到另一個不同嗎?我已經閱讀了這篇文章,但我仍然感到困惑。
連結進入血腥細節,但這個問題似乎需要一個簡單的是/否答案。
對於
ENGINE=MyISAM
orMEMORY
,唯一的鎖是表鎖。對於
ENGINE=InnoDB
:可以這樣想——它鎖定了它必須查看的每一行。
- 列上沒有索引——它必須檢查每一行,所以所有行都被鎖定。這有效地鎖定了整個表。
UNIQUE
列上的索引——只需要觸摸一行,因此被鎖定。- 介於兩者之間…列上的非唯一性
INDEX
- 它必須鎖定具有該值的所有行。(可能“下一個”行也會被鎖定。)PS:
PRIMARY KEY
是 MySQL 中的一個UNIQUE
索引。其他一些供應商有不同的索引定義,有些確實有“表鎖”。有些人將一堆行鎖“升級”為“表鎖”。
底線:
- 根據需要添加一個
INDEX
,UNIQUE
或者不添加。- 如果您需要先查看該行
UPDATEing
,請使用事務和SELECT ... FOR UPDATE
.