Mysql学习笔记------锁

锁的基本类型:

共享锁:

共享锁又称为读锁,简称S锁,
加锁方式:
Select * from xxx where id = 1 LOCK IN SHARE MODE;
释放锁: commit/rollback;
它的特点我们通过测试试一下:
现有测试表t1:
在这里插入图片描述
开启事务并给数据加共享锁:
在这里插入图片描述
开启另一个事务也对该数据加锁:
在这里插入图片描述
此时我们依然能够加锁成功(查询出结果即为成功),因此可以得出一个结论,其他事务可以对同一条数据共享一把锁,都能访问到数据中.

继续测试,我们在另一个事务修改该数据:
在这里插入图片描述
此时修改失败并报错, 因此添加共享锁后,其他事务对该数据是不能进行写操作的.所以共享锁又称为读锁

总结: 添加共享锁后,其他事务可以对同一条数据共享一把锁,都能访问到数据中,但是只能读不能修改,原因是增删改操作时默认添加了排他锁,后面会提到

排他锁:

又称写锁,简称X锁.
加锁方式:
写操作: delete/update/insert 默认加排他锁
读操作: select * from xxx where id = 1 FOR UPDATE;

老规矩,直接测试:
开启事务,并对数据添加排他锁:
在这里插入图片描述
开启另一个事务,对该数据添加共享锁:
在这里插入图片描述
可以看到,查询43秒依然查不到,可以得出结论,排他锁是排斥共享锁的.

在另一个事务添加排他锁:
在这里插入图片描述
依然查不到,可以得出结论,连个排他锁也是互相排斥的.

普通读取:
在这里插入图片描述
普通读取是可以成功的.因为普通读取并没有加锁操作.

总结: 排他锁是不能够和其他锁并存的,如果一个事务获取了数据行的排他锁,其他事务就不能够再获取了,只有获取了排他锁的事务才能对该数据进行读取和修改,其他事务在不加锁的前提下可以读取该数据.上面提到过,增删改默认是添加排他锁的,所以一条添加共享锁的数据是不能修改的.

记录锁:
间隙锁:
临键锁:
这三个学的有点迷糊,等研究研究在更新…

表锁(意向锁):

意向锁是由数据引擎自己维护的,用户无法手动操作.
意向共享锁, 意向排它锁一起说了,他俩概念类似,当事务准备给数据行添加共享锁(排它锁)时,一定会先取得该表的意向共享锁(排他锁).
解释一下就是当事务要给某个数据加锁了,此时数据引擎会提前给这个表添加一个意向锁.意向锁是行锁的前提.

作用:
意向锁可以理解为是一个标识,比如说当我们要锁定一张表时,需要先确定该表中是否有行锁,那这样就需要进行全表扫描来确认了,如果该表数据量非常大时,对于性能,效率等影响是很大的,而有了意向锁之后,我们只需要判断该表中是否有意向锁即可了,简化了很多的扫描步骤.

锁的作用:

锁主要是为了解决事务对于数据并发访问产生的一系列问题.

那么锁主要锁住了什么呢? 其实锁锁定的并不是某一行或某一列数据,而是锁定的索引.

那如果一张表没有索引的话,加锁会怎么加呢?
可以直接测试一下:

开启事务,对数据行1 加锁:
在这里插入图片描述

开启另一个事务对数据行2加锁:
在这里插入图片描述
可以看到是失败的,给第三条第四条数据都失败,可以发现,当没有索引的时候,貌似是把整张表都锁住了,这是为什么呢?

其实在我之前的索引的文章中提到过,对于一张表来说,当没有指定聚集索引时,会将隐藏的ROW_ID作为聚集索引(一张表必定有聚集索引),而由于表中没有索引,在加锁的时候自然也无法指定索引,此时会进行全表扫描,将表中所有默认索引(ROW_ID)都锁住了,所以我们看起来像是整张表都被锁住了.

我们对id添加索引并对数据1加锁:
在这里插入图片描述

在另一个事务查询数据5:
在这里插入图片描述
查询成功.
还需要说一点的是,当我们通过唯一索引加锁时,也会将主键索引锁住,这是因为辅助索引存储的是存储索引和主键值,关于索引的文章也提到过,大家可以自己测一下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值