一、常见MySQL引擎对锁的支持
MyISAM:不支持事务,仅实现表锁。
InnoDB:支持事务,实现表锁和行锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及的数据集加排它锁;而对于普通SELECT语句,InnoDB不会加任何锁,当然我们也可以显示的为SELECT加锁,如select * from tableName where ... for update。
表锁虽然开销小,锁表快,但高并发下性能低。
行锁虽然开销大,锁表慢,但高并发下相比之下性能更高。
事务和行锁,都是在确保数据准确的基础上,提高并发的处理能力。
多个事务(包括行锁)操作同一行数据时,后来的事务处于阻塞等待状态,这样可以避免了脏读等数据一致性的问题。后来的事务(包括行锁)可以操作其他行数据,解决了表锁高并发性能低的问题。
二、InnoDB行锁的内部机制
InnoDB的行锁,是针对索引加的锁,不是针对记录加的锁。行锁的内部机制为:
(1)当使用索引列条件时的修改,即update ... where index_column 时,加行锁,否则升级为加表锁。
(2)当更新一张较大表的大部分甚至全部的数据时,即使将索引作为检索条件,MySQL仍会将行锁升级为表锁。
三、事务的特点