脏读、不可重复读、幻读的解析与演示——基于Mssql数据库

@[TOC]脏读、不可重复读、幻读的解析与演示——基于Mssql数据库

1. 解析

1.1脏读

脏读指的是,在两个并发事务A和B中,事务B会读到事务A还没有提交的记录。
例:A账户有500元,B账户有0元。A给B转账500元,A输入转账金额还没点确认的时候,B此时查询账户余额,发现余额已经为500元了,这就是脏读。

1.2不可重复读(针对updata操作)

不可重复读指的是,在同一个事务中,对同一条记录进行查询结果的出了不同的结果。
例:A账户有500元,B账户有0元。B先查询余额查出余额为0元,此时A向B转账500元并提交,B再查余额,查出余额为500元,这就是不可重复读。
PS: 咋一看上面的例子是合理的,那为什么说不可重复读是一种错误呢?一方面,不可重复读会违反数据库的隔离性(在此不做详细叙述),另一方面可能会出现下面这种情况:你有一张银行卡,是不允许透支的,你又要抢买一个很重要的东西(比如哪个明星的票什么的)于是在结账之前,你反复确认余额有100,是足够的,但在你点击确认的时候却又提示余额不足,然后你票没了,原因是你家人用网络银行刷了50块。

1.3幻读(针对insert)操作

幻读指的是,在同一个事务中,对同一个表进行select * from 【表名】操作,得出了两个不同的结果(多了一条记录)
例:假设有两个助教A和B,A在查询学生信息的时候发现没有一个id(主键)=1的学生记录,于是他准备用insert语句添加一条id=1的记录,但同时B也发现了这一点,并insert了一条id=1的记录并提交。这个时候A再使用insert语句插入id=1的记录的时候就报错了。对于A而言,一开始查询的时候明明没有id=1的记录,想插入时却报错,再查询的时候就发现id=1的记录已经存在了,就好像发生了幻觉一样,即幻读。

2. 演示<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值