MySQL中锁的详解

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。


MySQL中锁粒度对比,表锁和行锁的区别:

  • 锁定粒度:表锁 > 行锁
  • 加锁效率:表锁 > 行锁
  • 冲突概率:表锁 > 行锁
  • 并发性能:表锁 < 行锁

MyISAM和InnoDB分别支持什么粒度的锁?

MyISAM支持表锁,同时也支持列所,表锁加锁方式:

lock tables 表名 read;
lock tables 表名 write;
unlock tables;

锁的细分

锁名锁级别英文名称
共享锁行锁Shared Locks
排它锁行锁Exclusive Locks
意向共享锁表锁Intention Shared Locks
意向排它锁表锁Intention Exclusive Locks

共享锁

又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一个数据可以共享一把锁,都能访问到数据,但是只能读不能修改;

  • 加锁方式
select * from table where id = 1 Lock IN SHARE MODE;

释放锁:当前你事务结束,或者当前连接断开,都会释放当前锁,不管当前数据是否commit/rollback

排它锁

又称为写锁,简称为X锁,排它锁不能与其他锁并存,如果一个事务获取了一个数据行的排它锁,其他事务就不能再获取该锁,只有该获取了排它锁的事务是可以对数据行进行读取和修改。

  • 加锁方式:
    自动:delete / update / insert 默认加上X锁
    手动:select * from table for update

意向锁

意向锁是由数据引擎自己维护的,用户无法手动操作意向锁

  • 意向共享锁(Intention Shared Lock,简称IS锁)。表示事务准备给数据行加入共享锁,也就是一个数据行加共享锁前必须先取得该表的IS锁
  • 意向排它锁(Intention Exclusive Lock,简称IX锁)表示事务准备给数据行加入排它锁,说明事务在一个数据行加排它锁前必须先获得该表的IX锁。

为什么需要表级别的意向锁?假设没有意向锁,我们加表锁的时候,需要去扫描全表是否有存在锁,数据量过大的时候,会导致加锁效率很低。但是如果我们在加锁的时候,数据库给我们自动加上意向锁,标记当前表,某个地方已经有了锁,那么我们就可以以很低的消耗,来完成是否加锁这个动作

MySQL中的锁和Java中的锁的作用相同吗?

这两个种类的锁的作用都是一样的,都是为了解决资源并发的情况下,对资源的写问题的控制。简单来说就是解决并发。

MySQL中锁的本质是什么?

在MySQL数据库中,锁的本质就是对索引打上标记,如果当前表没有索引,则直接找到sequence/rownum这样的默认表序列,完成锁表。

### MySQL 中间隙的工作原理 #### 什么是间隙? 在MySQL的InnoDB存储引擎中,Gap Lock(间隙)是一种特殊的定方式[^3]。它不仅索引记录本身,还会定两个索引记录之间的“间隔”。这种设计可以有效阻止幻读现象的发生。 #### 间隙的作用范围 当数据库执插入或更新操作时,在某些情况下会自动施加间隙以确保数据的一致性和完整性。具体来说: - **防止幻影**:如果当前查询条件匹配不到任何现有记录,则会对符合条件的位置加上间隙; - **维护外键关系**:在外键检查期间也会涉及到间隙的应用场景,比如避免父中的某条记录被删除而影响子中外键约束的有效性[^2]; #### 加时机与模式转换 对于非唯一索引上的范围查询语句,InnoDB通常会在扫描过程中对遇到的第一个不满足WHERE条件之前的边界位置设置Next-Key Lock (即Record+Gap),直到最后一个满足条件之后紧接着的一个gap为止。而在处理UPDATE/DELETE命令时则更加严格——除了上述提到的情况之外,还可能针对整个区间实施全量级封。 ```sql SELECT * FROM t WHERE id BETWEEN 10 AND 20 FOR UPDATE; ``` 此SQL语句将会对id等于9和21这两个不存在于内的虚拟值之间形成一个连续区域进定,从而保障在此范围内不会出现新的竞争写入为。 #### 定冲突示例 假设有一个简单的商品库存管理格`products`,其中包含字段`product_id`作为主键以及`quantity`示数量。现在有两个并发事务T1和T2分别尝试向该内新增两条具有相同`product_id`的新纪录: | product_id | quantity | |------------|----------| | 100 | 50 | 此时如果没有启用间隙机制的话,就可能发生竞态条件导致重复插入同样的产品编号。但是由于存在间隙的存在,第二个试图提交更改的操作会被阻塞直至第一个完成其事务流程后再继续执下去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xlecho

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

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

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

打赏作者

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

抵扣说明:

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

余额充值