事务4种隔离级别

       数据库在并发的情况下,可能会出现脏读、不可重复读、幻读等问题。为了避免以上问题,数据库事务增加隔离级别,来保证数据的准确性。数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

1.Read uncommitted(读未提交)

读未提交,也就是常说的脏读,就是一个事务读取到其他事务未提交的数据,是级别最低的隔离机制。例如,老板给员工发工资1万,最后不小心发了1.2万,所以员工会看到1.2万,但是如果老板没有点击提交,就可以利用事务回滚,修改回1万,然后提交,这是工资就是1万了。员工看了是1.2万,但是实际上却只有1万,这就是所谓的脏读。为了解决脏读问题,可以使用下面的读提交。

2.Read committed (读提交)

就是一个事务要等另一个事务提交后才能读取数据。例如程序猿老王卡里有10万,打算买个8万的礼物,在付款前还查到卡里有10万,谁知道在付款的时候钱被老王的老婆花光了,导致付款的时候卡里余额已不足。

这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

3.Repeatable read (重复读)

当老王结账的时候,系统开始读取老王卡里还有多少钱,这个时候老王的老婆就不能败家了,必须要等老王这个事务结束才可以。

重复读可以解决不可重复读问题,这也是oracle默认的事务隔离级别。就是一个事务对同一份数据读取到的相同,不在乎其他事务对数据的修改,写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作,不过会出现幻读的情况。

就是老王在查看卡里有多少钱时,如果有1万,想打印出来,这个时候老王买东西花了3000,这个时候打印出来的金额就是7000,出现了幻读。当打印的时候事务开启,在事务提交的时候,中途插入数据,也就是再消费了,那么最后打印的数据和事务开启的时候看到的是不一样的,这就是所谓的幻读。

4.Serializable(序列化)

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


总结:脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读到的就是脏数据;不可重复读:事务A多次读取同一数据。事务B在A读取的过程中修改并提交,导致A读到的数据不一致;幻读:事务A读取数据的时候事务B进行了增加或者删除,导致A出现了幻觉一样。不可重复读侧重于修改,一般可以使用锁行解决。幻读侧重于增加或者删除,需要锁表。


小结:读未提交会导致出现脏读,那么为了解决脏读,进行读提交。但是读提交会导致出现重复读,为了解决这个问题,就可以采用重复读。但是重复读会引出幻读的问题。不过oracle的默认隔离级别就是重复读。如果要解决重复读,可以采用序列化,不过会降低效率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容