MySql数据库锁模块

MyISAM 和 InnoDb 引擎的锁的区别

MyISAM默认为表级锁,不支持行级锁
InnoDB默认为行级锁,同时支持表级锁

锁的分类

在这里插入图片描述

MyISAM的锁

  • 读锁(又叫共享锁)当有一个对表进行查询的操作在执行的时候,将会对表上一个表锁,其他对表的修改操作将不能执行,但是其他对表的读取操作能够执行。所有又叫共享锁
  • 写锁(又叫排他锁)当有一个对表进行写入的操作时,会对表上一个写锁,其他对表的查询、修改操作都不能够被执行,所以又叫做排他锁。
  • 还可以手动上锁与解锁方法如下
    写锁:
    在这里插入图片描述
    读锁
    在这里插入图片描述
    在这里插入图片描述
    读写锁
    在这里插入图片描述
    解锁
    在这里插入图片描述
    适用场景
    在这里插入图片描述

InnoDB的锁

使用二段锁(先对同一个事物中的操作加锁,在commit的时候再解锁)
默认使用行级锁,但是在关闭事务的情况下,在查询一行数据的同时,还是能对其进行修改。是因为InnoDB对锁进行了优化。为验证InnoDB能够进行行级锁,可以对查询的行加共享锁,之后,对另外一行进行修改,发现能够修改成功。
在这里插入图片描述
需要注意的是InooDB在使用索引查询的时候使用的是行级锁,非索引的时候会使用表级锁。

适用场景
在这里插入图片描述

乐观锁、悲观锁

悲观锁 主要就是共享锁和排它锁,也只有数据库本身的锁机制才能保证
当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制【又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”】。

乐观锁 一般通过外部程序实现
乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。
例如:
1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
在这里插入图片描述
2、使用时间戳

当前读和快照读

mysql中使用repeatable-read也能避免幻读。那么是如何实现的呢?
外在:快照读
内在:next-key锁(行锁+gap锁)
当前读与快照读

  • 当前读(每次读取的都是最新的数据):
    使用select…lock in share mode、select…for update、update、insert、insert的都是当前读
  • 快照读(可能是最新也可能不是)。
    在非serializable下不加锁的非阻塞读,select
    快照读为了提升性能而实现的,基于MVCC的多版本并发控制实现的,由于是多版本那么读取的就有可能不是最新版本。
    至于什么时候读取到的是最新值,什么时候不是呢
    这是由事务首次调用快照读的位置决定的。比如:在事务1中先使用快照读查询一条数据,事务2中对该条数据修改并提交,然后再事务1中继续用快照读查询数据,发现数据并没有更新,这时后读取的就不是最新的值。
    但是如果事务1在最开始的时候不查询,也就是不进行第一次查询,而是在事务2提交后进行一次查询,那么查询到的就是最新值。
    所以第一次调用快照读的位置很关键

在InnoDB引擎下快照读如何实现
我们需要了解到:
在这里插入图片描述
undo log的过程
在这里插入图片描述

next-key锁(行锁+gap锁)serializable隔离级别避免幻读的方法。

gap(空隙锁锁定一个范围但是不包括记录本身,目的是为了防止同一事务的两次当前读出现幻读的情况

对于主键索引和唯一索引
在这里插入图片描述
对于非唯一索引,或者不走索引
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值