@[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的记录已经存在了,就好像发生了幻觉一样,即幻读。