MySQL锁的简介

1:并发问题:同一时间进行读写,可能会引起数据不一致问题,

2:解决并发问题:MySQL使用锁机制去解决并发问题

 

3:锁的分类

MySQL使用两种锁机制去解决该问题:共享锁和排他锁,也叫读锁或者写锁

共享锁、读锁:不影响其他链接的读,写会受影响

排他锁、写锁:会不让其他链接进行读写

MySQL针对不同的数据粒度,又分别使用表锁和行锁进行锁定

4:锁的实现

MySQL是使用MVCC(Multi-Version Concurrency Control)实现的(性能很好,其实并没有真正额上锁)

悲观锁(真正上锁)

乐观锁:通过一些递增的字段来控制逻辑上锁

MVCC这种机制是用过对一行数据的几个隐藏列进行操作来实现的

与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control

B+树的数据行,其实每一行都要加上几个隐藏列(版本号,相当于一条记录对应多个版本号,可以理解成一个版本号对应一个数据快照)

在MVCC并发控制中,读操作可以分成两类

快照读(snapshot read):  读取的是记录可见版本(有可能是历史版本),不加锁

例:select * from tablename where ?;

当前读(current read):读取的是记录的最新版本,并且当前读返回的记录,读会加锁,保证其他事务不会再并发修改这条记录  

例:select * from tablename where ? for update 

 

5:锁实现是分服务层和存储引擎层

    服务层只是实现了表锁:

         加锁: lock table tablename read(write),tablename2 read(write)

         解锁:unlock tables;

    存储引擎层实现了行锁(只有innodb 和extraDB实现了行锁)

    若存储引擎层和服务层都实现了行锁,但实现逻辑不一样,优先使用存储引擎层的实现

    比如事务部分会隐式的去加行锁和表锁,其中这个表锁不是服务器层实现的表锁

行锁和表锁性能对比

*表锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率高

*行锁:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突概率最低

InnoDB和MyISAM最大区别:InnoDB有行锁和事务

MySQL的InnoDB中是对索引上锁的(聚集索引)

    GAP锁(间隙锁)

    RECORD锁(记录锁)

    NEXT-KEY锁(间隙锁和记录锁的结合)MySQL默认采用NEXT-KEY

 

你可能感兴趣的:(数据库,MySQL)