MySql并发版本_锁机制超全大总结

MySql并发版本_锁机制超全大总结

本文对MySQL中的所激进进行一份详细总结。

宏观

数据库锁

粒度小,方便用于集群环境

代码锁

粒度大,需要封装

微观

分类

只有明确指定主键,才会执行行锁,否则执行表锁

  1. 无锁
    主键不存在
  2. 行锁
  3. 表锁
    主键不明确

锁算法(机制)

  1. 行锁算法
  • Record Lock(普通行锁)
    键值在条件范围内,记录存在
  • Gap Lock(间隙锁)
    键值不在条件范围内,叫做间隙(GAP),引擎就会对这个间隙枷锁,这种机制就是Gap机制
  • Next-Key Lock(行&间隙)
    在键值范围条件内,同时键值又不存在条件范围内
  1. 表锁算法
  • 意向锁
    当一个事务带着表锁去访问另一个被加了行锁的资源,那么此时这个行锁就会升级成意向锁,将表锁住。
  • 自增锁
    事务插入自增类型的列时,获取自增锁。
    如果一个事务正在往表中插入自增记录,其它事务都必须等待。

实现

行锁和表锁是粒度的概念,共享锁和排它锁是它们的具体体现。

  1. 共享锁(S)
    允许一个事务去读一行,阻止其它事务去获取该行的排它锁
  2. 排它锁(X)
    允许持有排它锁的事务读写数据,阻止其它事务获取该资源的共享锁和排它锁
    注意点:某个事务获取数据的排它锁,其它事务不能获取该数据的任何锁,并不代表其它事务不能无锁读取数据。

另一种实现

不管什么锁都需要加失败重试

  1. 乐观锁
  2. 悲观锁

1.前言

锁是协调多个进程或线程并发访问某一资源的一种机制。相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。根据不同的存储引擎,MySQL中锁的特性可以大致归纳如下:

引擎 行锁 表锁 页锁
MyISAM
BDB
InnoDB
  • 表锁:
    开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低
  • 行锁:
    开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
  • 页锁:
    开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
  • 总结:*表锁更适用于以查询为主,只有少量按索引条件更新数据的应用;行锁更适用于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。

2.MyISAM引擎

MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎(实际 InnoDB是单独的一个公司,现在已经被Oracle公司收购)。但是MyISAM的表锁依然是使用最为广泛的锁类型。

# MySql

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×