浅谈事务的隔离级别

事务

1.概念

事务:它是一组SQL组成的一个执行单元,要么全执行要么全不执行

2.特性

ACID

2.1原子性(Atomicity)

事务是一个最小的执行单位,事务里面的SQL要么全执行,要么全不执行,就拿A与B转账为例,一条语句从A里扣钱,另一条语句往B身上加钱,如果这两条语句不能全部执行,而是成功了一部分,那事务就没有存在的意义了。

img

2.2隔离性(Isolated)

Isolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题,

img

2.3持久性(Durable)

事务完成对数据的修改后,对修改结果是永久的。

img

2.4一致性(consistent)

比如转账:A给B转账100;A账户减少100,B账户就增加了100。这样就保证了数据的一致性。

3.事务并发带来的问题

3.1更新丢失

双方同时编辑一个文档时,A在修改文档时,B又修改文档,双方都不知道对方的存在,导致后面的人修改完成后会覆盖前面的文档,导致数据丢失。

3.2脏读(Dirty Reads)

一个事务在执行时修改了某条数据,另一个事务正好也读取了这条数据,并基于这条数据做了其他操作,因为前一个事务还没提交,如果基于修改后的数据进一步处理,就会产生无法挽回的损失。(事务没有提交就读取,)

3.3不可重复读(Non-Repeatable Reads)

同样是两个事务在操作同一数据,如果在事务开始时读了某数据,这时候另一个事务修改了这条数据,等事务再去读这条数据的时候发现已经变了,这就是没办法重复读一条数据(两次读到的数据不一样)

3.4幻读(Phantom Read)

事务一开始按某个查询条件没查出任何数据,结果因为另一个事务的影响,再去查时却查到了数据,这种就像产生幻觉了一样,被称作幻读。(第一次读没读到,第二次却读到了)

img

4.事务的四种隔离级别

4.1读未提交 (Read uncommitted)

读未提交其实就是事务没提交就可以读(可能导致脏读)

4.2读提交(Read committed)

事务提交后才能读(可能导致不可重复读)

4.3可重复读(Repeatable read)(MySQL默认级别)

看名字就看出来了,它的出现就是为了解决不可重复读问题,事务A一旦开始执行,无论事务B怎么改数据,事务A永远读到的就是它刚开始读的值。那么问题就来了,假设事务B把id为1的数据改成了2,事务A并不知道id发生了变化,当事务A新增数据的时候却发现为2的id已经存在了,这就是幻读。(导致幻读)

4.4序列化(serializable)

这个就是最无敌的存在了,所有的事务串起来一个个执行,因为没有并发的场景出现了,什么幻读、脏读、不可重复读统统都不存在的。但是同样的,基本并发能力会非常差。最终,到底什么隔离级别完全要根据自己的业务场景选择,没有最好的,只有最适合的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值