锁保证数据并发访问的一致性、有效性。锁是mysql在服务器层和存储引擎层的并发控制。
锁机制
共享锁与排他锁
- 共享锁(读锁):其它事务可以读,但不能写
- 排他锁(写锁):其它事务不能读,也不能写
锁粒度
mysql不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现锁机制。
- MyISAM和MEMORY存储引擎采用表级锁(table-level locking)
- BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁
- InnoDB存储引擎支持行级锁(row-level locking),也支持表级锁,默认情况下采用行级锁
默认情况下,表锁和行锁都是自动获取,不需要额外的命令。
在有些情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制和锁来完成。
不同粒度锁的比较
1、表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发读最低。
表级锁更适合以查询为主,并发用户少,只有少量按索引条件更新数据的应用
2、行级锁:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突概率最低,并发读也最高。
最大程度支持并发,同时也带来最大的锁开销
行级锁只在存储引擎层实现,而mysql服务器层没有实现,行锁更适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用
3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁粒度界于表锁和行锁之间,并发读一般。