数据库
首页 > 数据库> > (十三)MySQL锁机制

(十三)MySQL锁机制

作者:互联网

1.常见问题

2.锁的分类

从锁的粒度上分MySQL支持的锁

从锁的操作上可以分为

从实现方式上分

使用场景

3.表级锁的使用

MySQL Server 层实现
每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低
应用在MyISAM,InnoDB,BDB等存储引擎中。

MySQL的表级锁有两种:

表锁有两种表现形式:

表读锁

表写锁

4.元数据锁

MDL(metaDataLock)元数据:表结构
在MySQL5.5 版本中引入了MDL,当对一个表做增删改查操作的时候,加MDL 读锁;当要对表结构变更操作的时候,加MDL写锁。

元数据读锁

5.行级锁

InnoDB实现
行级锁:每次操作锁住一行数据。锁粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

RecordLock锁:锁定单个行记录的锁。RC,RR隔离级别都支持。

GapLock锁:间隙锁,锁定索引记录间隙,确保索引记录的间隙不变。RR隔离级别支持。

Next-key Lock锁:行锁和间隙锁组合,同时锁住数据,并且锁住数据前面的Gap。RR隔离级别支持。

行读锁

行读锁升级为表锁

常见行锁升级为表锁举例

session1:
  begin;
  update mylock set age=10 where name='y';
  commit;

name 没有索引,update会锁定整张mylock表,造成其他的访问mylock的请求全部等待

行写锁

3,session2:select * from mylock where id =1; --可以读 不加锁。是因为MVCC(针对行)机制,多版本读。
4,session2:select * from mylock where id =1 lock in share mode; --加了读锁,就会被阻塞(加写锁 for update 一样会被阻塞,单纯的select 是无锁的,才可以MVCC多版本读)。

6.什么是读写锁?什么是排他锁?

锁是计算机协调多个进程或者线程并发访问某一资源的机制。锁使用独占的方式来保证在只有一个版本的情况下事务之间相互隔离,所以锁可以理解为单版本控制。
引入锁之后就可以支持并行处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。

读写锁,可以让读和读并行,而读和写,写和读,写和写这几种之间还是要加排他锁。

排他锁
引入锁之后就可以支持并行处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。

注意,在整个事务1结束之前,锁是不会被释放的,所以,事务2必须等到事务1结束之后开始。

读写锁
读写锁,可以让读和读并行,而读和写,写和读,写和写这几种之间还是要加排他锁 。

如果几个事务之间没有共享数据项,完全可以并行被处理

7.行锁是什么?有那些分类,原理是什么?

InnoDB存储引擎实现,每次操作锁住一行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。

InnoDB的行级锁,按照锁定范围来说,分为三种:

行级锁分类
按照功能来说分为两种:

行锁原理

8.死锁是如何产生的?如何解决?

加锁是实现数据库并发控制的一个非常重要的技术。当两个事务的锁发生冲突,互相等待对方的锁释放,不能继续执行事务逻辑,就会出现死锁,严重影响应用的正常执行。

死锁的现象主要有:

表锁死锁
产生原因:用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这样死锁就产生了

解决方案:

行级锁死锁
产生原因1:
在事务执行了一条不满足条件的 for update操作,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。

解决方案:SQL语句不要使用太复杂的关联多表的查询,优化索引。

产生原因2:
两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁。

解决方案:
在同一个事务中,尽可能做到一次锁定所需要的所有资源
按照id对资源排序,然后按照顺序进行处理
采用MVCC机制处理

共享锁转换为排他锁
产生原因:
事务A查询一条记录,然后更新该条记录;
此时事务B也更新该条记录,这时事务B的排他锁由于事务A有共享锁,必须等A释放共享锁后才可以获取,只能排队等待,事务A再执行更新操作时,此处发生死锁,因为事务A需要排他锁来做更新操作。但是,无法授予该锁请求,因为事务B已经有一个排他锁请求,并且正在等待事务A 释放其共享锁。

解决方案:
避免引发同时对同一条记录多次操作
使用乐观锁进行控制

标签:行级,事务,加锁,10,十三,索引,死锁,MySQL,机制
来源: https://www.cnblogs.com/everyingo/p/15356112.html