首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

事务的隔离级别详解

关注我,每天三分钟,带你轻松掌握一个Java相关知识点。

之前的文章我们说过,事务有4个限定属性,分别是原子性、一致性、隔离性和持久性,这里补充一下方便大家记忆。

原子性针对的是一个事务,一个事务不可分割提交都提交,回滚都回滚。

一致性针对的数据间,说的是事务前后,数据间要保持一致性,比如我账户少了100块,那别的账户一定是多了100块。

隔离性针对的事务间,它描述的是一个事务对另外一个事务的影响,也是我们今天要说的重点。

持久性针对的是数据属性,指一个事务提交后,它所影响的数据更改就不可逆了,生米煮成熟饭了。

这里面其他三项都很好记也很好理解,唯独隔离性有点复杂,因为它涉及了一个概念,叫隔离级别。

隔离级别从弱到强分为四种隔离程度,Read Uncommited、Read Commited、Repeatable Read和Serializable。

Read Uncommited:望名生义,一个事务读取了另一个事务没有提交的数据。这种隔离级别隔离程度是最低的,因为它无法避免以下几个问题:

脏读:举个例子,有一个事务,在A账户扣钱,在B账户加钱。A账户扣完钱,另一个事务读取A账户的金额使用了,但第一个事务回滚了,这样实际数据库中钱是没有扣除的,这就导致了第二个事务读取的数据是一笔脏数据。

不可重复读:一个事务,多次对一条数据进行读取,读取到的数据不一样。比如一个事务第一次看A账户是1000,中间另一个事务对这条数据进行了更新操作,那么第二次读得时候就变成900了,这就是不可重复读。

幻读:幻读说的是一个事务查询多条数据,执行几次查询结果不同。这里需要跟不可重复读区分一下,不可重复读说的是同一条数据的更新导致不可重复读,幻读多是另一个事务对数据数据做了新增或者删除,导致查询结果条目不准确。

Read Commited:一个事务的操作结果只有等提交后,才能被另一个事务看到。这个是大部分数据库采用的默认隔离级别,它能解决脏读的问题,但是不能解决不可重复读和幻读的问题。

Repeatable Read:这个隔离级别可以保证,在整个事务中,对于同一笔数据读取结果是相同的,不管其他事务对这个数据进行更新提交,对本事务来说没有影响。这个级别能解决脏读和不可重复读得问题,但是不能解决幻读的问题。

Serializable:这个是最严格的级别。它能解决以上所有的问题,但缺点也狠明显,因为它解决问题的本质是让所有的事务操作都必须一次顺序进行,这样性能就会差到令人发指。也正是因为这样,这个隔离级别用到的场景极少。通常我们使用其他隔离级别加并发锁就可以实现这个级别的数据一致性,性能还远高于使用这个级别。

通常情况下,数据库都有自己的默认隔离级别,像oracle只支持Read Commited、Serializable。我们使用spring框架可以指定隔离级别,但是如果指定了数据库不支持的隔离级别,数据库就会使用自己默认的。

相信大家也感觉到了,隔离级别越高,数据一致性也越高,而性能就越低,所以在开发场景中怎么使用就需要大家去权衡了。

以上就是今天的知识点,各位小伙伴get到吗?创作不易,望各位多多点赞收藏,有什么建议可以留言告诉我,我会积极采纳!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190702A09PJP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券