MySQL---锁

目录

一、事务隔离级别的实现原理     锁  +  MVCC   

1.1、怎么引出锁呢?

 1.2、表级锁&行级锁

 1.3、排它锁和共享锁

 二、串行化怎么解决幻读问题的呢?  间隙锁

2.1、范围查询条件下

 2.2、等值查询条件下

 三、已提交读和可重复读的底层实现   MVCC(多版本并发控制)

3.1、undo  log回滚日志的主要作用

3.2、已提交读是怎么解决脏读的呢?

 3.2、已提交读   为什么会有   不可重复读  和  幻读?

3.3、可重复读   为什么解决了    不可重复读问题?

 3.3、可重复读   为什么部分解决了    幻读问题?

四、意向共享锁与意向排他锁

五、死锁问题


一、事务隔离级别的实现原理     锁  +  MVCC   

1.1、怎么引出锁呢?

 1.2、表级锁&行级锁

表级锁(MyISAM支持):对整张表加锁。开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低。
行级锁(Innodb支持):对某行记录加锁。开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并 发度高。

 

 1.3、排它锁和共享锁

排它锁 Exclusive ),又称为 X ,写锁。
共享锁 Shared ),又称为 S ,读锁。
X S 锁之间有以下的关系: SS 可以兼容的, XS SX XX 之间是互斥的

显示加锁 select ... lock in share mode 强制获取共享锁, select ... for update 获取排它锁
我们可以来 显示加一下排他锁来观察一下:
以主键为过滤条件

普通字段为过滤条件:

 所以我们能得出结论Innodb的行锁是加在索引上面的,是给索引在加锁,并不是给单纯的行记录在加锁;所以如果过滤条件没用加索引的话,使用的就是表锁,而不是行锁

 二、串行化怎么解决幻读问题的呢?  间隙锁

2.1、范围查询条件下

间隙锁(gap  lock)

 但是我们这时候能插入吗?不能

 为什么insert不了呢?就是因为间隙锁的存在

间隙锁给查询范围的间隙之间都加上了锁

 2.2、等值查询条件下

当用主键为过滤条件的时候,是不用管的,因为主键不能重复,就算再次插入相同的数据,也是直接就会失败的

但是普通索引(辅助索引)的话就有问题要探讨了

 三、已提交读和可重复读的底层实现   MVCC(多版本并发控制)

MVCC(多版本并发控制)==》并发的读取方式:快照读

innodb提供两个读取操作: 锁定读  和  非锁定读  MVCC提供的快照读  =》依赖底层的一个技术  =》undo  log回滚日志

3.1、undo  log回滚日志的主要作用

1、事务发生错误时回滚rollback

2、提供了MVCC的非锁定读(快照读)  得从undo  log的原理说起

3.2、已提交读是怎么解决脏读的呢?

我们都知道,已提交读的隔离级别下,能够解决“脏读”,但不能解决不可重复读

已提交读用的读是非锁定读,就是不是通过加锁来实现的,而是用到了MVCC提供的快照读

 3.2、已提交读   为什么会有   不可重复读   幻读

 因为其他事务更新后而且已提交的数据(commit过了),可以实时反馈到当前事务的select快照中!

每一次select都会重新产生一次数据快照。

幻读的产生就和这个相似了:

因为每一次select都会产生一次数据快照,其他食物增加了和当前事务查询条件相同的新的数据,并且已成功commit提交,导致当前事务再次以相同的条件查询时,数据多了

3.3、可重复读   为什么解决了    不可重复读问题

第一次select产生了数据快照,而且只产生一次。

 3.3、可重复读   为什么部分解决了    幻读问题

解决了insert导致的幻读问题:

 当前事务是可以看到自己事务的修改、更新的操作

当前事务用了update,还是会出现幻读的现象,并没用完全规避掉。

快照内容读取原则
1 、版本未提交无法读取生成快照
2 、版本已提交,但是在快照创建后提交的,无法读取
3 、版本已提交,但是在快照创建前提交的,可以读取
4 、当前事务内自己的更新,可以读到

四、意向共享锁与意向排他锁

这两个锁都是和表锁相关的,目的是为了更快的获取表锁

在绝大部分情况下都应该使用行锁,因为事务和行锁往往是选择 InnoDB 的理由,但个别情况下也使用
表级锁;
1 )事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,
而且可能造成其他事务长时间等待和锁冲突;
2 )事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。

使用表锁的时候,涉及一个效率的问题?

五、死锁问题

 实际使用MySQL时:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值