innodb 实现了行锁机制,这是它相对 myisam 的最大优点之一。但是它的行锁是一种基于索引的“准行锁”,也就是说,只有通过索引检索数据才会加行锁,否则加的将是表锁。而且对于相同索引的不同记录,innodb 加的是同一个锁。
例如: select * from t where name = “iknow” for update;只有当你在 name 字段建了索引,innodb 才会给以上语句加行锁, 并且如果name=”iknow”有多条记录, innodb 会给这多条记录一起加行锁。另外,需要注意的是,在不同索引上的锁也会互斥,也就是说,如果两条更新语句使用了不同的索引,但是这两个索引覆盖了相同的记录,那么它们会也会互斥。
由于 innodb 采用了 mvcc 的事务机制,所以它的锁只会阻塞写,从不阻塞读