InnoDB引擎下的锁机制


锁是保持并发访问下数据一致性的一个重要工具;当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制;

MySQL的锁划分

1、按照锁的粒度来划分,MySQL分为行级锁、页级锁和表级锁;

  • 行级锁表示只针对当前操作的行进行加锁。分为共享锁和排他锁;
    优点:锁定粒度最小,对当前操作的行记录加锁,发生锁冲突的概率最低,并发度也最高;
    缺点:加锁开销大,加锁慢;会出现死锁;

  • 表级锁 表示对当前操作的整张表加锁
    优点:加锁开销小,加锁快;不会出现死锁;
    缺点:锁定粒度大,对当前操作的整张表加锁,发出锁冲突的概率最高,并发度最低;

  • 页级锁 页级锁是一次锁定相邻的一组记录。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
    特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

2、按并发控制程度可以分为乐观锁和悲观锁
悲观锁:假定会发生并发冲突,每次去查询数据的时候都认为别人会修改,每次查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制

乐观锁:假设不会发生并发冲突,每次去查询数据的时候都认为别人不会修改,所以不会上锁,在修改数据的时候才把事务锁起来。实现方式:乐观锁一般会使用版本号机制或CAS算法实现

3、也可以按照服务单位分为:
内部锁:MySQL在自身服务器上的锁,锁住的是自己的一些记录;
外部锁:会话中可用的表锁,客户会话用显式锁从而阻止其他会话访问锁;可以使用LOCK TABLE和UNLOCK TABLE;

InnoDB下的行级锁处理

innoDB实现了两种行级锁,共享锁和排他锁,其中共享锁允许事务读取一行数据,而排他锁只允许事务删除或更新一行数据;可以通过表INNODB_LOCKS查看事务锁的情况;
简单来说,共享锁可以被多个事务同时持有,而排他锁是互斥的,只能等待共享锁释放了才能获取;两个事务锁兼容性如下,兼容性指个事务是否可以同时持有锁;
在这里插入图片描述

为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁(Intention Lock)。意向锁是将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度(fine granularity)上进行加锁,意向锁就是如果要对某一记录上锁,也需要在它的页、表、数据库上意向锁;

InnoDB存储引擎有3种行锁的算法,其分别是:

❑Record Lock:单个行记录上的锁

❑Gap Lock:间隙锁,锁定一个范围,但不包含记录本身

❑Next-Key Lock∶Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身

  • 单行锁会锁住索引记录;如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。;
  • 间隙锁的作用是为了组织多个事务将记录插入到同一范围内;
  • InnoDB存储引擎采用Next-Key Locking的算法避免Phantom Problem(幻读)它不仅锁了索引记录,只能由一个访问,而且锁了索引变化的范围导致不能由新的记录进来事务;从而解决幻读的问题;

死锁问题

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。解决死锁问题最简单的方式是不要有等待,将任何的等待都转化为回滚,并且事务重新开始。简单的设个超时;即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。

若超时的事务所占权重比较大,如事务操作更新了很多行,占用了较多的undo log,这时采用FIFO的方式,就显得不合适了,因为回滚这个事务的时间相对另一个事务所占用的时间可能会很多。

除了超时机制,当前数据库还都普遍采用wait-for graph(等待图)的方式来进行死锁检测。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值