mysql 锁机制

2020-03-26  本文已影响0人  later02

mysql中的锁:

介绍:

卫生间的门

作用:

保证事务之间的隔离性,也保证了数据的一致性。

保证资源不会争用。锁是属于资源的,不是某个事务的特性。

每次事务需要资源的时候,需要申请持有资源的锁。

 锁类型

资源:

内存锁:mutex , latch     保护内存数据页不被争用,不被释放。

对象锁:

MDL(元数据锁)   : 修改元数据,DDL操作 ,(表也会锁定)

Table_lock : 表锁 DDL,备份(FTWRL 全局表锁)  lock tables read city;也可能升级为表锁

record(row) lock: 行锁,索引锁,锁定聚簇索引

GAP: 间隙锁,建立在RR级别下的非唯一索引,即辅助索引。跟新范围

Next-lock:  下一键锁, gap +  record(row) lock,普通辅助索引的范围锁

对象锁的粒度

MDL(元数据锁)   : 修改元数据,DDL操作 ,(表也会锁定)

Table_lock : 表锁 DDL,备份(FTWRL 全局表锁)  lock tables read city;也可能升级为表锁

record(row) lock: 行锁,索引锁,锁定聚簇索引

GAP: 间隙锁,建立在RR级别下的非唯一索引,即辅助索引。跟新范围

Next-lock:  下一键锁, gap +  record(row) lock,普通辅助索引的范围锁

功能分类:

IS :意向共享锁 表级别

S:共享锁,读锁 行级别

IX:意向排他锁 表级别

X:排他锁,写锁 行级别

验证gap锁:

建表和数据准备:

create table(id int auto_increment,

age int  ,

name varchar(20),

PRIMARY KEY (id)

,key idx_n (age)

)engine = innodb charset=utf8mb4;

desc gab_test;

insert into gab_test (age,name) values  (4,'liliw1'),(6,'lilir1'),

(9,'lilit1'),(13,'lilri1'),(24,'lilic1'),(28,'lilis1'),(29,'lilig1'),(30,'lilik1'),

(45,'lilig1'),(46,'lilid1'),(48,'lilid1'),(49,'liliq1'),(50,'lilia1'),(67,'lili1oo'),(67,'lilidd1'),

(68,'lili1dd'),(69,'lilidd1'),(70,'lilifd1'),(71,'lilidd1'),(73,'lili1j'),(74,'lilfdi1'),(75,'lilifds1'),

(78,'liliwer1'),(88,'lilifsdf1'),(89,'lili1'),(91,'lfdsili1'),(92,'lilifds1'),(93,'lilire1'),(94,'ljili1'),

(95,'lfdili1'),(98,'lilnhi1'),(99,'litgli1'),(99,'liljui1'),(100,'lilsdi1'),(100,'lililo1'),(111,'lilian1'),

(112,'lilfdsi1'),(113,'lilhyi1'),(114,'lilfsdi1'),(115,'liecli1'),(116,'liliny1'),(224,'lilvfdei1'),(212,'liljhyi1'),

(213,'lilsdfi1'),(215,'lilvcvi1'),(216,'liliwerv1'),(222,'lilivsds1');

select  * from gab_test;

会话1: 进行update ,把10以下的age 的name更新为凤姐

会话2:进行插入操作,插入一个age为1的数据.可以看到进行了锁等待.

会话3:进行锁的查看:

GAP锁等待

可以看到会话2插入芙蓉姐姐的数据,进行了排他锁X,和GAP锁的等待。

事务的一致性ACID的C的特性

A:原子性:UNDO,REDO

D:持久性 : commit 的数据,REDO(写入到磁盘)

I:隔离性:ISOLATION Level,Lock,MVCC(Undo)

C:保证事务工作前中后数据的状态都是完整的。一致性的。

所以c的特性是以上所有特性都是来保证一致性的。

写一致性:undo,redo ,lock

读一致性:ISOLATION level,mvcc (undo)

数据页一致性 :

double write buffer (两次写)

说明:

double writebuffer 是Innodb在tablestpace

上的128个页(2个区),大小是2MB;为了解决partail page 

wirte的问题,buffer pool 跟新的数据页先写入到 double write buffer中, 在写入到 磁盘。

(详细看书)

上一篇 下一篇

猜你喜欢

热点阅读