MySQL锁详解

目录

前言

MySQL锁

共享锁和排他锁 - Shared and Exclusive Locks

意向锁 - Intention Locks

索引记录锁 - Record Locks 

间隙锁 - Gap Locks

临键锁 - Next-Key Locks

插入意向锁 - Insert Intention Locks

AUTO-INC Locks

死锁

死锁产生条件

InnoDB对死锁的检测


前言

    在高并发场景下数据库性能往往是尤为重要的,通常会采用一些缓存中间件来解决数据库并发问题。这篇文章将介绍数据库层面一些与并发有关的知识。

MySQL锁

1)锁类型

    锁类型依赖于存储引擎,在InnoDB存储引擎中按照锁的粒度分为,行级锁 RECORD ,和表级锁TABLE

    行级锁:是对表中的某些具体的数据行进行加锁

    表级锁:是对整个数据表进行加锁

2)锁模式

    锁模式,⽤来描述如何请求(申请)锁,分为共享锁(S)、独占锁(X)、意向共享锁(IS)、意向独占锁(IX)、记录锁(精准行锁)、间隙锁、Next-Key锁(临键锁)、AUTO-INC锁、空间索引的谓词锁等。

共享锁和排他锁 - Shared and Exclusive Locks

    InnoDB实现了标准的行级锁,分为两种分别是共享锁(S锁)和独占锁(X锁),独占锁也称为排他锁。

    共享锁(S锁):允许持有该锁的事务读取表中的一行记录,同时允许其他事务在锁定行上加另⼀个共享锁并读取被锁定的对象,但不能对其进行写操作,也就是加排他锁需要阻塞等待。

    独占锁(X锁):允许持有该锁的事务对数据行进行更新或删除,同时不论其他事务对锁定行进行读取或修改都不允许对锁定行进行加锁,也就是加共享锁和排他锁都会阻塞。

示例:

  • 如果事务T1持有R行上的共享锁(S),那么事务T2请求R行上的锁时会有如下处理:
    • T2请求S锁会立即被授予,此时T1和T2都对R行持有S锁
    • T2请求X锁不能立即被授予,阻塞到T1释放持有的锁
  • 如果事务T1持有R行上的独占锁(X),那么T2请求R行上的任意类型锁都不能立即被授予,事务T2必须等待事务T1释放R行上的锁

 读锁是共享锁的一种实现,写锁是排他锁的一种实现

意向锁 - Intention Locks 

 InnoDB支持多粒度锁,允许行锁和表锁共存

  • InnoDB使⽤意向锁实现多粒度级别的锁,意向锁是表级别的锁,它并不是真正意义上的加锁,而只是在 data_locks 中记录事务以后要对表中的哪一行加哪种类型的锁(共享锁或排他锁),意向锁分为两种:
    • 意向共享锁(IS):表示事务打算对表中的单个行设置共享锁。
    • 意向排他锁(IX):表示事务打算对表中的单个行设置排他锁。
  • 在获取意向锁时有如下协议:
    • 在事务获得表中某一行的共享锁(S)之前,它必须⾸先获得该表上的IS锁或更强的锁。
    • 在事务获得表中某一行的排他锁(X)之前,它必须⾸先获得该表上的IX锁。 
  • 意向锁可以提⾼加锁的性能,在真正加锁之前不需要遍历表中的行是否加锁,只需要查看⼀下表中的意向锁即可
  • 在请求锁的过程中,如果将要请求的锁与现有锁兼容,则将锁授予请求的事务,如
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值