MySQL-锁

锁的作用

用于管理对共享资源的并发访问,保证数据库的完整性和一致性

按粒度分类

行锁和表锁

粒度小的优缺点:

- 好处:锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高;
- 坏处:系统开销大(加锁、释放锁、检查锁的状态都需要消耗资源)

在选择锁的粒度时,需要在锁开销和并发程度之间做一个权衡。

按类型分类

1.读写锁

概念

互斥锁(Exclusive) 简写为 X 锁,又称写锁。
共享锁(Shared) 简写为 S 锁,又称读锁。

规则

一个事务对数据对象 A 加了 X 锁, 就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
一个事务对数据对象 A 加了 S 锁 可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。

兼容关系

在这里插入图片描述

2.意向锁

名称说明
概念意向锁可以认为是s锁和x锁在数据表上的标识。
作用通过意向锁可以快速判断表中是否有记录被加上锁,从而避免遍历的方式来查看表上锁情况,提高效率。
规则一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁;
IS/IX 锁之间都是兼容的;
优点提高效率
- 有了意向锁之后,只需要检测整个表是否存在IX/IS/X/S锁就行了,从而避免遍历的方式查看表上锁情况。
1. 任意IS/IX锁之间都是兼容的,因为它们只表示想要对表加锁,并不是真的加锁
2. 这里的兼容关系针对时表级锁,而表级锁的IX锁和行级的X锁兼容,两个事务可以对两个数据行加X锁。

锁协议

三级锁协议

名称说明
一级事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁。
可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。
二级在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,
根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。
三级在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。

二段锁协议

事务必须严格分为两个阶段对数据进行加锁和解锁的操作。
第一阶段加锁,第二阶段解锁。
也就是说一个事务中一旦释放了锁,就不能再申请新锁了。

可串行化调度是指,通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。
事务遵循两段锁协议是保证可串行化调度的充分条件。

MySQL 隐式与显式锁

隐式锁

MySQL 的 InnoDB 存储引擎采用两段锁协议,
会根据隔离级别在需要的时候自动加锁,并且所有的锁都是在同一时刻被释放,这被称为隐式锁。
意向锁是 InnoDB 自动加的,不需用户干预。

  • 对于UPDATE、 DELETE 和 INSERT 语句, InnoDB 会自动给涉及数据集加排他锁;
  • 对于普通 SELECT 语句, InnoDB 不会加任何锁;

显示锁

InnoDB 也可以使用特定的语句进行显示锁:

  • SELECT … LOCK In SHARE MODE; S锁
  • SELECT … FOR UPDATE; X锁

什么是乐观锁和悲观锁?

悲观锁

概念

认为数据随时会被修改,因此每次读取数据之前都会上锁,防止其它事务读取或修改数据;

应用场景

数据更新比较频繁的场景;

乐观锁

概念

操作数据时不会上锁,但是更新时会判断在此期间有没有别的事务更新这个数据,若被更新过,则失败重试;

应用场景

适用于读多写少的场景。

实现方式

加一个版本号或者时间戳字段,每次数据更新时同时更新这个字段;
先读取想要更新的字段或者所有字段,更新的时候比较一下,只有字段没有变化才进行更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值