全栈之路JAVA基础课程八mysql事物隔离级别20190624v10

45次阅读

共计 1398 个字符,预计需要花费 4 分钟才能阅读完成。

欢迎进入 JAVA 基础课程

博客地址:https://mp.csdn.net/mdeditor/…
本系列文章将主要针对 JAVA 一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触 JAVA 开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加 QQ:243042162。

寄语:
近日,“有最美辅导员“和“最美大学生”发布仪式在央视播出,树立起新时代辅导员和大学生的学习榜样。当下,我们也应该争做“最美程序员”,给世界一片美好。

概述

数据库是可以控制事务的传播和隔离级别的,Spring 在之上又进一步进行了封装,可以在不同的项目、不同的操作中再次对事务的传播行为和隔离级别进行策略控制。注意:Spring 不仅可以控制事务传播行为(PROPAGATION_REQUIRED 等),还可以控制事务隔离级别(ISOLATION_READ_UNCOMMITTED 等)。

  • 脏读 (Drity Read): 另一个事务修改了数据,但尚未提交,而本事务中的 SELECT 会读到这些未被提交的数据。
  • 不可重复读(Non-repeatable read): 解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。
  • 幻读(Phantom Read): 解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

事物的隔离级别

隔离级别越高,并发性能越低。MySQL 默认的级别是:Repeatable read 可重复读。

  • READ UNCOMMITTED(未提交读)。 在 RU 的隔离级别下,事务 A 对数据做的修改,即使没有提交,对于事务 B 来说也是可见的,这种问题叫脏读。这是隔离程度较低的一种隔离级别,在实际运用中会引起很多问题,因此一般不常用。

  • READ COMMITTED(提交读)。 在 RC 的隔离级别下,不会出现脏读的问题。事务 A 对数据做的修改,提交之后会对事务 B 可见,举例,事务 B 开启时读到数据 1,接下来事务 A 开启,把这个数据改成 2,提交,B 再次读取这个数据,会读到最新的数据 2。在 RC 的隔离级别下,会出现不可重复读的问题。这个隔离级别是许多数据库的默认隔离级别。

  • REPEATABLE READ(可重复读)。 在 RR 的隔离级别下,不会出现不可重复读的问题。事务 A 对数据做的修改,提交之后,对于先于事务 A 开启的事务是不可见的。举例,事务 B 开启时读到数据 1,接下来事务 A 开启,把这个数据改成 2,提交,B 再次读取这个数据,仍然只能读到 1。在 RR 的隔离级别下,会出现幻读的问题。幻读的意思是,当某个事务在读取某个范围内的值的时候,另外一个事务在这个范围内插入了新记录,那么之前的事务再次读取这个范围的值,会读取到新插入的数据。Mysql 默认的隔离级别是 RR,然而 mysql 的 innoDB 引擎间隙锁成功解决了幻读的问题。

  • SERIALIZABLE(可串行化)。 可串行化是最高的隔离级别。这种隔离级别强制要求所有事物串行执行,在这种隔离级别下,读取的每行数据都加锁,会导致大量的锁征用问题,性能最差。

参考网站:
(1)https://www.cnblogs.com/maypa…
(2)https://baijiahao.baidu.com/s…

正文完
 0