引言
在事务的隔离级别中我们会看到四种事务隔离级别(读未提交,读已提交,可重复读,串行化),和在不同隔离级别下会产生的问题,其中第一个问题就是再读未提交下会产生脏读的情况。那究竟什么是脏读?而脏读又回引起什么问题呢?
什么是脏读
首先有两个背景要说明一下
- MySQL服务并不是单线程运行的
- 脏读就是事务产生的修改在提交之前,已经可以被其他事务给读到了。
假设两个不同的线程分别有两个不同的事务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了。
|