在阐述隔离级别之前,先详细的介绍三个概念:
脏读:
脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
比如说银行卡转账,A向B转5000元。对于数据库方面的操作是A的账户减少5000,B的账户增加5000.当A给B转帐后,B的账户先增加5000,此时,B去查看账户,发现钱已经收到。然后A的账户要减少5000,但是在减少5000的时候发生了点问题,导致事务回滚。B中增加的5000也就消失了。但是B由于刚才查过账户,认为已经转账成功了。
不可重复读:
是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改
了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
比如说,有一张银行卡内存款5000.小A先查询卡内有5000余额,于是想去银行取出来。小A的女朋友在网上看上了一件衣服。通过银行卡购买了衣服,消费了1000元。等到小A去银行准备取出5000时,发现银行卡内只有4000元幻读:
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中
的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加
范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。
比如说:小A准备打印这个月银行卡的消费记录。小A查了下,一共有10条。小A查完后,此时小A的女朋友又利用银行卡进行了一笔消费。此时的消费记录是11条。当小A直接打印消费记录,发现一共是11条而不是10条的时候,以为发生了幻觉。
然后事务的隔离级别就是用来解决上述三个问题的:
事务的隔离级别一共有四种:
分别是Read uncommitted、Read committed、Repeatable read、Serializable.
√: 可能出现 ×: 不会出现
脏读 | 不可重复读 | 幻读 | |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |