`
eastenhh
  • 浏览: 1135 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

面试篇之对数据库事务隔离级别的理解

阅读更多

所谓数据库隔离级别,就是为了解决两个或多个事务之间操作同一个数据库对象是出现的冲突问题。对数据的操作无非是读写,事务隔离级别也主要是在事务的读写之间进行隔离。
首先列一下4种隔离级别:
1.read uncommited(可读未提交的)
2.read commited(提交了才能读)
3.repeatable read(可重复读)
4.serializable(序列化读写)

先从简单说起吧,serializable无非是最严格的,不官你是读还是写,必须排队一个个来,所以这个隔离级别不会出现脏读幻读之类的问题,每个事务操作的都是完完全全属于自己的数据,不会有其他事务和你挣。但是可想而知这种级别也是效率最低的,很少场景会使用这种隔离级别。

read uncommited可读取未提交的数据,就是我在写的时候你顺便读,我在数据库写你读到的就是什么,但这时候写的事务并没有提交,所以读到的是脏数据。一版数据库默认都是使用这个事务隔离级别。

read commited 比read uncommit级别更高一点,我写的时候,你是不能读的,只有我提交了你才能读,这种级别偏向于写,可以理解成写的地位更高,读的都的往后排。这样避免了脏读的问题,但是会有这样一种情况,假设我需要读两遍数据库,我第一次读到数据,好,这个时候你开始写的事务,因为你地位高我就等你写完再读,这下可想而知数据被改了,在读的时候与第一次读到的数据就不一样了,这个就叫幻读。

幻读是两次读到的数据不一致,与脏读表象是一样的。但是区别于脏读,脏读读到的数据是写事务还未提交的数据,而幻读是写事务已提交了数据。只是前后两次读到的不一致,感觉像产生幻觉一样。

那怎么解决幻读这个问题呢,很明显我们会想到把读的地位提高,我要读两次你就得等我两次读完你才能写,这就是repeatable read 可重复读,读的事务开始了,爱怎么读怎么读,写给我靠边站,这样就不会出现幻读,这种级别比read commited又高了一级。

这就是数据库的4种隔离级别。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics