脏读会引起什么问题

脏读会引起什么问题

引言

在事务的隔离级别中我们会看到四种事务隔离级别(读未提交,读已提交,可重复读,串行化),和在不同隔离级别下会产生的问题,其中第一个问题就是再读未提交下会产生脏读的情况。那究竟什么是脏读?而脏读又回引起什么问题呢?

什么是脏读

首先有两个背景要说明一下

  1. MySQL服务并不是单线程运行的
  2. 脏读就是事务产生的修改在提交之前,已经可以被其他事务给读到了。

假设两个不同的线程分别有两个不同的事务A和B,他们按照下面的时序来执行,假设初始值为0。那么,在B1读数据阶段就会读到200的值。这就是脏读,在A2提交步骤执行前,其他线程的事务读到了它要修改的值。

事务A 行数据 事务B A1:设为200 B1:读数据 B2:加100 B1:提交 A2:提交 事务A 行数据 事务B

会引起什么问题

那这会有什么问题呢?200本来不就是要提交的吗?问题就在于事务提交可能失败,失败以后会回滚。还按照上面的图来说明问题,在隔离级别为读未提交的情况下,AB两个事务正常执行完以后值应该是300。可是假设A事务执行过程中产生异常回滚了,我们期望的值其实应该是100。但是不好意思,因为在B1步骤已经读到值为200,然后再加100,那结果值就只能是300了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值