锁分类
- 行级锁
- 页面锁
- 表级锁
引擎支持的锁
- MyISAM: 表锁
- MEMORY: 表锁
- BDB: 默认页面锁,支持表锁
- InnoDB: 默认行锁,支持表锁
MyISAM锁
写互斥,写写互斥。
concurrent_insert
concurrent_insert是MyISAM的一个配置参数,用于控制读写是否可并发,有以下三个可选值
- 0: 不允许并发插入
- 1: 当不存在删除行的时候,可在读的时候进行表尾插入操作,默认选项
- 2: 无论是否存在删除行,都可以在读的时候进行表尾插入操作
锁调度
写的优先级高于读,所以对一张表的操作队列,即使写操作是后进来的,也会插入到等待的读操作前面。这样导致写很多的时候读很容易阻塞,这也是为什么锁MyISAM适合读多写少的场景。
Innodb锁
事务与ACID属性
- 原子性(Atomicity)
- 一致性(Consistent)
- 隔离性(Isolation)
- 持久性(Durable)
并发事务遇到的问题
- 更新丢失
- 脏读
- 不可重复读
- 幻读
事务隔离级别
数据多版本并发控制(MVCC)
- 未提交读(Read uncommitted)
- 已提交读(Read committed)
- 可重复读(Repeatable read)
- 可序列化(Serializable)
实现
只有通过索引条件检索数据时,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
- X锁(排他锁)
- IX锁(意向排他锁)
- S锁(共享锁)
- IS锁(意向共享锁)
GAP锁
Next-Key锁
悲观锁与乐观锁
悲观锁
乐观锁