sql

mysql-锁

2021-03-31  本文已影响0人  IT雪山

一 什么是锁

锁机制用于管理对公共资源的并发访问。

1.1 优点

数据是一种供多用户共享的资源,保证数据并发访问的一致性,有效性

1.2 缺点

加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否已解除、释放锁等 ,都会增加系统的开销。

1.3 两段锁

数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)

1.4 隔离级别

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了构建这些隔离级别存在的。


截屏2021-04-01 10.51.42.png

查看事务的隔离级别(注意:polardb用的是READ-COMMITTED)
select @@global.transaction_isolation;
select @@global.tx_isolation;

二 锁分类

2.1表锁

2.1.1 特点

由MySQL SQL layer层实现,表锁是对整张表加锁,开销小,加锁快,无死锁,锁粒度大,发送锁冲突概率极高,并发性极低(myisam引擎是表锁,并发读没有问题,并发插入性能会差一些)

2.1.2 分类

1 表锁
2 元数据锁(meta data lock, MDL)
在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结
构变更操作的时候,加 MDL 写锁。

1、session1: 
begin;--开启事务 
select * from mylock;--加MDL读锁 
2、session2: 
alter table mylock add f int; -- 修改阻塞 
3、session1:commit; --提交事务 或者 rollback 释放读锁 
4、session2:Query OK, 0 rows affected (38.67 sec) --修改完成 Records: 0 Duplicates: 0 Warnings: 0

MySQL 实现的表级锁定的争用状态变量


截屏2021-03-31 15.43.56.png

show open tables:
查看哪个表被锁住 in_use

2.2页锁

加锁时间和锁粒度介于表锁和行锁之间,会出现死锁,并发处理能力一般

2.3行锁

2.3.1 分类

InnoDB存储引擎实现, 行锁很重要本章重点研究行锁
InnoDB的行级锁,按照锁定范围来说,分为三种:
记录锁(Record Locks):锁定索引中一条记录。 主键指定 where id=3
间隙锁(Gap Locks): 锁定记录前、记录中、记录后的行 RR隔离级 (可重复读)-- MySQL默认隔离级
Next-Key 锁: 记录锁 + 间隙锁

按照功能来说,分为两种:
共享读锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他写锁(X):允许获得排他写锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁(不是读)和排他写锁。

2.3.2 示例

对表执行新增、修改、删除,或者select ...for update时,会触发数据库的锁机制
InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过
索引条件检索的数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
where 索引 行锁 否则 表锁

上一篇 下一篇

猜你喜欢

热点阅读