脏读(无效数据读取):当一个事务处理的数据还没提交就被另一个事务修改(一般是回滚)强调 的是同一事务,两次,未提交
不可重复读的重点在于修改,同样的条件,你读取过的数据再次读出来发现值不一样,强调的是同一事务,两次,提交
不可重复读:同一事务内,多次同样的查询结果不同,(一个事务读取到另一个事务已经提交的数据)并不矛盾这两句
幻读:一个事务先后读取一个范围的记录,但两次记录数不同,(有幽灵数据),中间有别的事务新增或删除,强调的是范围,记录和增删
幻读的重点在于增加和删除
下面举三个例子
1.杨志买刀(脏读)
a(杨志) 0 (账户余额)
b(买刀者) 1000
-----------------------------
b(买刀者):
start transaction;
update account set money=money-100 where name='b';
update account set money=money+100 where name='a';
==============================
a(杨志)
start transaction;
select * from account;
a:100
b:900
==============================
b: rollback;
==============================
a:
select * from account;
a:0
b:1000
在还未完成交易(提交事务)时,买刀者回滚事务,数据没有更改。
2.不可重复读
活期 定期 固定资产
a 1000 1000 1000
------------------------------
b:
start transaction;
select 活期 from account where name='a'; --- 活期存款:1000元
select 定期 from account where name = 'a'; --- 定期存款:1000元
select 固定 from account where name = 'a'; --- 固定资产:1000元
---------------------------
a:
start transaction;
update account set 活期=活期-1000 where name= 'a';
commit;
select 活期+定期+固定 from account where name='a'; ---总资产:2000元
3.幻读
a 1000
b 2000
------------------------------
工作人员d:
start transaction;
select sum(money) from account; --- 总存款3000元
select count(*) from account; --- 总账户数2个
-----------------
c:
start transaction;
insert into account values ('c',3000);
commit;
-----------------
select avg(mone) from account; --- 平均每个账户:2000元
需要注意的是,这里说的是隔离性可能造成的问题,所以a,b事务几乎同时发生,多线程高并发。