宏观
数据库锁
粒度小,方便用于集群环境
代码锁
粒度大,需要封装
微观
分类
只有明确指定主键,才会执行行锁,否则执行表锁
- 无锁
主键不存在 - 行锁
- 表锁
主键不明确
锁算法(机制)
- 行锁算法
- Record Lock(普通行锁)
键值在条件范围内,记录存在 - Gap Lock(间隙锁)
键值不在条件范围内,叫做间隙(GAP),引擎就会对这个间隙枷锁,这种机制就是Gap机制 - Next-Key Lock(行&间隙)
在键值范围条件内,同时键值又不存在条件范围内
- 表锁算法
- 意向锁
当一个事务带着表锁去访问另一个被加了行锁的资源,那么此时这个行锁就会升级成意向锁,将表锁住。 - 自增锁
事务插入自增类型的列时,获取自增锁。
如果一个事务正在往表中插入自增记录,其它事务都必须等待。
实现
行锁和表锁是粒度的概念,共享锁和排它锁是它们的具体体现。
- 共享锁(S)
允许一个事务去读一行,阻止其它事务去获取该行的排它锁 - 排它锁(X)
允许持有排它锁的事务读写数据,阻止其它事务获取该资源的共享锁和排它锁
注意点:某个事务获取数据的排它锁,其它事务不能获取该数据的任何锁,并不代表其它事务不能无锁读取数据。
另一种实现
不管什么锁都需要加失败重试
- 乐观锁
- 悲观锁
1.前言
锁是协调多个进程或线程并发访问某一资源的一种机制。相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。根据不同的存储引擎,MySQL中锁的特性可以大致归纳如下:
引擎 | 行锁 | 表锁 | 页锁 |
---|---|---|---|
MyISAM | √ | ||
BDB | √ | √ | |
InnoDB | √ | √ |
- 表锁:
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低 - 行锁:
开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高 - 页锁:
开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般 - 总结:*表锁更适用于以查询为主,只有少量按索引条件更新数据的应用;行锁更适用于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。
2.MyISAM引擎
MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎(实际 InnoDB是单独的一个公司,现在已经被Oracle公司收购)。但是MyISAM的表锁依然是使用最为广泛的锁类型。