概念:
它描述了事务解决并发问题的特征
并发:多个事务(用户)在同一时间,访问并操作了相同的数据
同一时间:不是指一个时刻,而是一个较小的时间段
并发会产生哪些问题:
1、脏读
2、幻影读
3、不可重复读
并发问题如何解决
通过隔离属性来解决。
脏读:
一个事务,读取了另一个事务中没有提交的事务,会在本事务中产生数据不一致的问题。
例子:
A用户和B用户同时对同一个账户进行操作,账户中有500块钱,A用户优先对账户进行 操作,进行了取钱操作,取出了200块钱,但是并没有提交,此时B用户也对账户进行了操 作,进行了读操作,认为现在账户中的存款为300元,但是此时A又对账户进行了回滚,账 户余额变成了500,但是B读的却是300,造成了数据的不一致。
它的本质是事务 B 去查询了事务 A 修改过的数据,但是此时事务 A 还没提交,所以事务 A 随时会回滚导致事务 B 再次查询就读不到刚才事务 A 修改的数据了,这就是脏读。
不可重复读:
一个事务中,多次读取相同的数据,但是读取的结果不一样。会在本事务中产生数据不一致的问题。
例子:
假设有事务A,事务B,事务C,此时A对一条数据进行读操作,读取了一条数据,此时B 对这条数据的信息进行了修改(此时如果B的修改事务没有提交,A是无法读取的,也就是 不会出现脏读的情况),并进行了提交,即我们现在假设的前提是事务 A 只能在事务 B 提 交之后读取到它修改的数据。
此时A再次读取这个数据,读取的却是B修改后的值,即和A第一次读的值不同,并且在 此之后,C又对数据进行了修改并且进行了提交,A读取在C之后又进行了读取,即A在同一 个事务中,读取到了三次不同的值,这就是不可重复读。
幻影读:
一个事务中,多次对整表进行查询统计,但是结果不一样,会在本事务中产生数据不一致的问题。
例子:
,你一个事务 A,先发送一条 SQL 语句,里面有一个条件,要表中有多少数据,然后呢,它一开始查询出来了 10 条数据。接着这个时候,事务 B往表里插了几条数据,而且事务 B 还提交了,此时多了几行数据。此时A又对表进行了相同的查询,此时的数据变成了12条数据,就像出现了幻觉一样。