MYSQL锁机制

死锁

什么情况下会产生死锁

死锁是指两个或者两个以上进程在执行过程中因争夺资源而造成一种互相等待的现象,若无外力作用,他们都无法再推进下去,此时称系统图处于思索状态或者系统产生了死锁,这些永远互相等待的进程称为死锁进程,表级锁不会产生死锁,所以MYSQL的死锁主要针对的还是innoDB。

类型死锁情况
表级锁
页级锁可能会
行级锁

死锁演示

在这里插入图片描述
通常在应用中,在事务隔离级别RR(默认)下,两个事务对相同数据使用了排它锁,在被偶遇符合该条机的情况下,两个事务都会加锁成功。如果是在程序中发现记录不存在就新增一条数据,如果两个事务都这么做,就会发生死锁情况。

死锁处理方式

  1. 等待。直到超时(可在配置文件中设置超时时间:innodb_lock_wait_timeout=50s
  2. 发起死锁检测。主动回滚一个事务,让其他事务继续执行。

死锁检测原理
是构建一个以事务为顶点,锁为边的有向图,判断有向图是否有环,如果有环就就是发生了死锁。
回滚
检测到死锁之后,选择插入更新或者删除行数最少的事务进行回滚,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段来判断。

MVCC-乐观锁

什么是MVCC

英文全称叫Multi-Version Concurrency Control,即多版本并发控制。MVCC使得innoDB的事务隔离界级别下执行一致性读取操作有了保证,换言之就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个可以用来增强并发性的技术。因为不用等待另一个事务释放锁就能查询。但是这项技术在数据库领域并不是普遍使用的。也有很多不支持MVCC。
mysql的innoDB引擎除了实际的数据之外,还会加上3ge隐藏的字段,如下:

create_no(创建版本号或者创建时间)update_no每次修改的版本号或者修改时间)delete_no(删除版本号或者删除时间)

MVCC是乐观锁的一种实现方式,但并不是乐观锁就是MVCC。

悲观锁

悲观并发控制(又名“悲观锁”,缩写“PCC”)是一种并发控制的方法。他可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行操作读取某行数据应用了锁,那么只有当这个事务释放了锁,其他事务才能够执行与该锁冲突的操作。
使用场景
在商品购买场景中,当有多个用户对某个库存有限的商品同时进行下单操作。若采用先查询库存,后减库存的方式进行库存数量的变更,将会导致超卖的产生。
解决
使用悲观锁可以解决该问题:我们可以在查询库存是就加把排它锁,这样当事务2在查询的时候就会出现锁等待现象,只有到前面的事务1释放,事务2才能继续 操作。而当事务2可以查询时事务1已经修改了数据,判定为不符合库存。

间隙锁

当我们使用范围查询而不是相等条件查询,并请求共享或者排它锁的时候。innoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内单不存在的记录叫做“间隙(GAP)”,innoDB也会对这个“间隙”加锁,这种机制就是所谓的间隙锁(NEXT-KEY)。

session1session2
start transactionstart transaction
select * from table where id between 1 and 10;
此时已经锁住了id为1-10的数据
先修改id为12的数据试试
update table set username=‘start’ where id=12;
在来试试id为5的数据
update user_s set username=‘start’ where id=5;
进入锁等待
释放
commit
修改成功

行锁升级为表锁

innoDB行级锁是通过给索引上的索引项加锁来实现的。innoDB行级锁只有通过索引条件检索数据才使用行级锁。否则innoDB使用表锁(在不通过索引(主键)条件查询的时候,innoDB是表锁而不是行锁)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值