MySQL锁机制与优化实践

数据库乐观和悲观锁

乐观锁

比如在数据库中设置一个版本字段,每操作一次,都会将这行对应的版本号+1,这样下次更新都会拿到最新的版本号更新,如果一个事务拿到了版本号但是更新前其他人已经将版本号升级了,那么当前事务就会更新不到这条数据。也就达到了隔离的效果

悲观锁

直接加锁,加了锁以后其他进来访问就访问不了

锁分类

读锁

select * from 表名 where id=1 lock in share mode

读锁不互斥,同一个数据多个读操作不会互斥,可以同时进行

写锁

select * from 表名 where id=1 for update

写锁互斥,操作同一个数据,其中一个给这个数据加上了写锁,那么其他的操作就只能等待,等这个操作的写锁取消了才能再进行操作。

意向锁

主要是为了针对表锁,当想要给表加锁可能还要遍历当前表每一行数据看看有没有加行锁,但是意向锁的作用就是如果当前表加了行锁就会给表加一个标识代表当前表有行锁,这时候如果要加表锁就会发现表中有行锁。

间隙锁

上图中表可以看到主键id是断断续续的,那么现在有一个场景

当前隔离级别是MySQL默认隔离界别(可重复读)。

会给主键中缺少的数据加一个锁,比如10-15中间没数据,15-20中间没数据。

所以会加一个 (10,15)、(15,20)加锁。比如id > 1 and id <= 16 for update会加一个行锁在 1-16之间,但是又因为有间隙锁 15-20.所以在 1-20中间都会加锁,这时候其他事务想要插入或者修改1-20之间的数据都是要等待上个锁释放掉

临建锁

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值