【数据库】事务的四种隔离级别

发布时间:2024-03-29 18:01

学习之前要先了解,什么叫脏读、幻读和不可重复读

读未提交(read uncommit)(ru)

也就是说在一个事务还没有提交的时候,别的事务有可能读到这个未提交事务的数据

        比如事务1 将A的存款从700改成1000,事务1还没有提交的时候事务2读取到了事务1提交的1000,但是事务1发生了错误进行回滚,导致A的存款还是700,但是事务2认为A的存款是1000,就产生了脏读

读已提交(read commit)(rc)

也就是说一个事务提交以后才有可能被其他事物读到

        比如程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。

这时候就出现了不可重复读的情况,oracle就是用的这种情况

可重复读(repeatable read)(rr)

就是在开始读取数据时,不再允许修改操作

        程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

但是会出现幻读问题

也就是程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。

这个地方个人理解是,程序员买单的事务,可以拆分为查询余额,扣除余额之前查询余额,扣除余额,这里是进行更新操作,别的事务在这个时候不能进行修改,但是在进行查询记录的时候,因为过程时查询,打印之前在查询,只有select,没有update,所以会程序员消费相当于增加一条记录,就会产生幻读

序列化(serializable)

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

参考文章

事务的四种隔离级别_逐梦追风_博客-CSDN博客

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号