脏读,不可重复读和幻读的区别

    脏读(无效数据读取):当一个事务处理的数据还没提交就被另一个事务修改(一般是回滚)强调 的是同一事务,两次,未提交
    不可重复读的重点在于修改,同样的条件,你读取过的数据再次读出来发现值不一样,强调的是同一事务,两次,提交
    不可重复读:同一事务内,多次同样的查询结果不同,(一个事务读取到另一个事务已经提交的数据)并不矛盾这两句
    幻读:一个事务先后读取一个范围的记录,但两次记录数不同,(有幽灵数据),中间有别的事务新增或删除,强调的是范围,记录和增删
    幻读的重点在于增加和删除

下面举三个例子

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事务几乎同时发生,多线程高并发。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值