mysql中各种锁

根据粒度

可以分为行锁、页锁、表锁。
行锁是加在某条记录上,其余事务不能修改该条记录,但能修改其他记录;
表锁是加在某张表上,其余事务不能修改这张表的任何数据;
页锁是介于行锁和表锁之间,加在数据页上;

什么时候用到行锁、表锁
查询条件里面用到索引,是行锁;
查询条件没有用到索引,是表锁;

示例:
新建一张表student,id是主键,Age是唯一键,Name没有添加;
我们开2个tab窗口,每个窗口都去设置:
set @@autocommit = 0;
这样子控制事务的手动提交(执行commit或rollback),可以用select @@autocommit;来查看一下

没有用到索引:
在这里插入图片描述
在这里插入图片描述
此处使用到索引:
在这里插入图片描述
在这里插入图片描述

根据使用方式

可以分为读锁和写锁

读锁
select … lock in share mode
写锁
select … for update

加上读锁后,其余事务也能加读锁,但不能加写锁;
加上写锁后,其余事务不能加读锁,也不能加写锁;

在这里插入图片描述
但读锁也会造成死锁问题

根据思想

悲观锁、乐观锁
悲观锁:认为每次操作都是有其他线程的,所以都要先取加锁;能够加锁就继续执行,不能加锁就阻塞等待;以上的select … lock in share mode、select … for update都是乐观锁

乐观锁:认为每次操作没有其余线程,当要进行提交时,才去进行比较;事务一开始时,取出version字段,当要进行提交事务时,再去取出当前version字段,如果相等则提交事务,不相等则重新执行。

间隙锁

数据库中会有幻读问题,如何解决:可串行化隔离级别和间隙锁来控制;
间隙锁和行锁对应,行锁是锁住某条数据,间隙锁是锁住范围,不让其余事务插入。
next-key锁是行锁+间隙锁

普通索引,=、<、<=、>、>=都是next-key锁

主键索引和唯一索引用=,查询到数据是行锁,查询不到数据是间隙锁(两边都是开区间),用<、<=、>、>=是next-key锁

例:
age字段建立唯一索引,有如下数据:1,4,8,12,16:
age < 6、<= 6、< 8,锁住了(-无穷,8]和<= 8的行锁
age <= 8,锁住了(-无穷,12]和<= 12的行锁
age > 10、>= 10、> 8,锁住了(8,+无穷]和>8的行锁
age >= 8,锁住了(4,+无穷]和>4的行锁

age字段建立普通索引,还是以上数据:
age = 6,锁住了[4,8)
age = 8,锁住了[4,12)和8这一行锁
age < 6、<= 6、< 8,锁住了[-无穷,8)和<= 8的行锁
age <= 8,锁住了[-无穷,12)和<= 12的行锁
age > 10、>= 10、> 8,锁住了[8,+无穷)和>8的行锁
age >= 8,锁住了[4,+无穷)和>4的行锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值