mysql的行鎖是經過索引加載的,即行鎖是加在索引響應的行上的,要是對應的SQL語句沒有走索引,則會全表掃描,行鎖則沒法實現,取而代之的是表鎖。mysql
CREATE TABLE SIMPLE_USER( ID BIGINT (20) NOT NULL AUTO_INCREMENT, NAME VARCHAR (32) DEFAULT NULL, PHONE VARCHAR (11) DEFAULT NULL, ADDRESS VARCHAR (32) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
如上面的建表語句,當執行以下update語句時,數據庫對該表施加的是表鎖。即在該update執行完以前,全部對該表的update是不容許的。sql
UPDATE SIMPLE_USER SET ADDRESS='David Road' WHERE NAME='David';
當對 WHERE 條件的字段添加索引,如本例中的NAME字段,數據庫
ALTER TABLE SIMPLE_USER ADD INDEX idx_name(NAME);
再執行上面update語句時,數據庫對該表施加的是行鎖,此時僅對NAME='David'的行的update是不容許的,對 NAME<>'David' 的行的update不受影響。spa