mysql存储引擎之一~~InnoDB的隔离级别是如何实现的

参考别人文章,留作记录,方便以后查阅


一、mysql多事务并发的场景下会出现的问题:

1.脏读

事务A执行过程中的一次查询,读到了事务B修改但并未提交的数据,
后来B回滚,导致A读到了错误数据,这是脏读。
脏读

2.不可重复读

事务A两次相同查询的间隔中,事务B修改了这些记录的数据并提交,
导致A两次读到的记录数据不一致,这是不可重复读。
不可重复读

3.幻读

事务A两次相同查询的间隔中,事务B插入了符合条件的记录并提交,
导致A两次读到的记录条数不一致,这是幻读。
幻读

二、隔离级别

1.读未提交(Read Uncommitted)

一般不会用于实际项目。

2.读已提交(Read Committed)

大部分数据库的默认隔离级别,如oracle、sql server等,但是不包括mysql InnoDB。

3.可重复读(Repeatable Read)

mysql InnoDB默认的隔离级别。

4.可串行化(Serializable)

事务隔离的最高级别,会使数据库的并发性能大幅下降,现实中应用很少。

各隔离级别对应的问题:
在这里插入图片描述

三、常见锁

在这里插入图片描述

1.乐观锁和悲观锁

它们不是真实存在的锁,只是一种机制或者说是理论。

悲观锁,它总是假设最坏的情况,每次去访问数据都认为别人会修改,
所以每次访问数据都会加锁,Java中synchronized就是悲观锁的实现。

乐观锁,它总是假设最好的情况,每次去访问数据都认为别人不会修改,
只会在更新的时候去判断一下数据有没有被修改,如果没有被修改才更新,否则重试或失败。

2.共享锁(Shared Lock)也叫读锁或S锁

若事务A对数据对象a加上S锁,则事务A只能读a;
其他事务还可以再对a加S锁,却不能加X锁,直到A释放a上的S锁;
这样保证了其他事务可以读a,但在A释放a上的S锁之前不能对a做任何修改。

3.排它锁(Exclusive Lock)也叫写锁或X锁

若事务A对数据对象a加上X锁,则事务A可以读或写a,其他事务则不可以再对a加任何锁。

4.行锁(Record Lock)

锁住对应的行,使其它事务无法修改这些数据,但是无法限制insert操作。

5.间隙锁(Gap Lock)

锁住一个范围,使其它事务无法在该范围内插入数据。

参考文章

「CaptainCats」的原创文章: InnoDB的隔离级别是如何实现的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值