`
grunt1223
  • 浏览: 422021 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入浅出事务之隔离级别

阅读更多
除了事务传播属性(可参考我的另一篇文章《深入浅出事务之传播属性》)之外,另一个需要开发人员关注的是事务的隔离级别,它决定了一个事务中所进行的更新操作对其它事务的可见性。事实上,DBMS、EJB、Spring都允许你设置不同的隔离级别,你必须保证它们相互统一、兼容;因此,应用服务器可能支持许多种隔离级别,但要使用其中的某一种,首先你必须保证你的数据库也支持它。

事务的隔离性实质上是数据库的并发性与一致性的函数。随着事务隔离级别的上升,数据库的一致性随之上升,而并发性反而下降。事务隔离的这种特性实际上会影响一个应用的性能和数据完整性,例如,对于性能要求较高的应用比如信用卡处理等,您可以适当降低其事务隔离级别,以提高整个应用的并发性(但是会降低数据的完整性);对于并发量较小的应用比如财务处理等,您可以适当提高其事务隔离级别,以提高数据的完整性(但是会降低应用的性能)。大多数应用服务器和数据库都有自己默认的事务隔离级别,当然,通过Spring或EJB您可以很方便地修改。

Spring和EJB都支持四种基本的事务隔离级别,它们是(隔离级别从低到高的顺序):
  • 读未提交(TransactionReadUncommited)
  • 读已提交(TransactionReadCommited)
  • 可重复读(TransactionRepeatableRead)
  • 串行化(TransactionSerializable)


6.2.1、读未提交
这是Spring所支持的最低的隔离级别,在该隔离级别下,事务允许在其它事务提交之前,读取其未提交的、对数据库的任何修改。为了说明这个问题,我们还是以在线交易为例,假设当前的价格为90.00,此时,有两个事务同时到达,事务A执行更新操作,而事务B执行查询操作;在事务隔离级别设置为“读未提交”时,该场景的处理流程如下图所示:

]

注意,在t2时刻,事务A对数据库进行了一次更新操作,而它提交之前,事务B就可以在t3时刻观察到这种变化,读取到更新后的价格(94.23);也就是说,事务A中的更新操作完全没有被隔离。如果事务A因为异常回滚,那么事务B中读取的数据就是脏数据。这一隔离级别违反了最基本的ACID特性,因此很多数据库都不支持(包括Oracle) 。

6.2.2、读已提交
这一隔离级别允许多个事务同时操作一组数据,但是隐藏了事务之间所有未提交的更新;即事务A看不见事务B中对数据库所作的修改,直到事务B提交为止。仍然以上面的在线交易为例,此时的处理流程如下图所示:



注意,当事务A在t2时刻更新了价格(94.23)之后,事务B在t3时刻仍然看不到该更新,此时读取价格仍然是90.00。这是一种是用较多的隔离级别,它既允许了事务B获取数据(支持并发性),同时又隐藏了其它事务(事务A)对该数据的更新,直到(事务A)提交的那一刻为止。几乎所有的数据库都支持“读已提交”的隔离级别,并且大部分将其作为缺省的隔离级别。

6.2.3、可重复读
这是较之前两者更为严格的事务隔离级别,它真正将所有事物相互隔离起来。该隔离级别确保,事务开始时读取到的一组数据,在整个事务周期内都不会改变(除非拥有读写锁的事务本身修改了它),直到该事务提交为止。仍然以上面的在线交易为例,此时的处理流程如下图所示:



注意在这个例子中,尽管在事务B执行期间,事务A插入了一条数据(QRS),但是在事务B在t2时刻查询所得的结果依然和t0时刻一样(不包含QRS),即使到了t4时刻,事务A已经提交了也是如此(这一点不同于“读已提交”) 。只有在事务B也提交了,它才会看见事务A对数据库所作的修改。值得注意的是,该隔离级别下,会在被查询或修改的数据上加上读写锁,因此任何想要修改该数据的其它事务会等待(或失败),直到“可重复读”的事务提交为止。

6.2.4、串行化
这是JAVA所支持的最高隔离级别。在该隔离级别下,所有同时到达的事务将会“排队进入”,保证每次只允许一个事务操作数据。(我们后面将会看到,对于Oracle来说,这并不完全正确) 。使用“串行化”的隔离级别,应用的并发性明显下降,而数据完整性则显著提高。仍然以上面的在线交易为例,此时的处理流程如下图所示:



此时,事务B将会一直挂起,直到事务A提交(或回滚) 。尽管所有的数据库都支持这种隔离级别,Oracle的处理方式略有不同,它使用“多版本数据“的方式来避免事务B的挂起。但是,如果事务B试图获取事务A所处理的数据时,Oracle会抛出ORA08177的错误信息,提示该事务隔离级别下,无法串行获取数据。
  • 大小: 25.2 KB
  • 大小: 26.2 KB
  • 大小: 26.1 KB
  • 大小: 24.7 KB
3
2
分享到:
评论

相关推荐

    5.深入浅出分布式事务 唐刘.pdf

    解决这些问题通常需要采用特定的事务隔离策略,例如两阶段提交(2PC)、多阶段提交(3PC)或者基于乐观锁和悲观锁的并发控制机制。在实际应用中,还需要考虑到性能、可用性和扩展性等因素,这往往需要权衡和优化。 ...

    夏昕.深入浅出Hibernate.rar

    《深入浅出Hibernate》是夏昕撰写的一本关于Hibernate框架的经典教程,对于想要掌握Hibernate技术的开发者来说,这本书无疑是一份宝贵的资源。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java...

    深入浅出MyBatis技术原理与实战 源代码

    理解如何正确设置事务的隔离级别、回滚规则和传播行为对于确保数据一致性至关重要。 最后,日志和异常处理也是MyBatis使用过程中不可忽视的部分。MyBatis集成了多种日志框架,如Log4j、Logback等,帮助开发者调试和...

    深入浅出hibernate,需要的下载

    《深入浅出Hibernate》这本书是Hibernate技术学习的重要参考资料,它为读者提供了全面、深入的Hibernate框架理解。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互,使得...

    Hibernate深入浅出

    《Hibernate深入浅出》是一本专门针对Java开发者深入理解Hibernate框架的重要参考资料。Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互,将复杂的SQL操作隐藏在对象...

    深入浅出-MySQL数据库开发、优化与管理维护

    《深入浅出-MySQL数据库开发、优化与管理维护》是一本专为IT专业人士设计的全面指南,涵盖了MySQL数据库从基础到高级的各个方面。这本书旨在帮助读者深入理解MySQL的内部机制,提升开发效率,优化数据库性能,并掌握...

    夏昕 深入浅出hibernate

    《夏昕 深入浅出Hibernate》是关于Java领域持久化框架Hibernate的一本经典教程。作者夏昕,以其深入浅出的讲解风格,为读者揭示了Hibernate的内在原理和实际应用,帮助开发者更好地理解和使用这个强大的ORM(对象...

    深入浅出 MySQL 数据库开发优化与管理维护

    《深入浅出 MySQL 数据库开发优化与管理维护》是一本专为MySQL爱好者和专业人士准备的指南,旨在帮助读者深入理解MySQL的各个方面,并提供实用的优化和管理策略。MySQL作为世界上最受欢迎的关系型数据库管理系统之一...

    深入浅出Hibernate

    在事务管理部分,你会了解到如何利用Hibernate进行数据库事务的控制,包括事务的隔离级别和传播行为。此外,缓存机制也是Hibernate的一大亮点,教程会讲解第一级缓存(Session缓存)和第二级缓存(外部缓存,如...

    深入浅出Hibernate源码

    《深入浅出Hibernate源码》是一本专注于解析Hibernate框架源码的专业书籍,旨在帮助开发者深入了解Hibernate的工作机制,提升开发和优化数据库应用的能力。通过学习这些源码,我们可以更有效地使用Hibernate,解决...

    深入浅出Hibernate.(夏昕 曹晓钢 唐勇)

    书中会讲解如何在Hibernate中使用编程式和声明式事务,以及事务隔离级别的概念和设置。 另外,性能优化也是Hibernate使用者关注的重点。书中有专门的章节探讨缓存机制(一级缓存和二级缓存)、批处理更新和检索策略...

    Hibernate深入浅出源码

    《Hibernate深入浅出源码》是一本专注于Java领域持久化框架Hibernate的专著,通过实践与理论相结合的方式,深入解析Hibernate的核心概念和技术。在学习这本书的过程中,你可以通过作者的编码测试来加深对Hibernate的...

    深入浅出INNODBMVCC机制与原理.docx

    【深入浅出INNODB MVCC机制与原理】 在数据库管理系统中,MVCC(多版本并发控制)是一种用于提高并发性能的技术,尤其在事务性存储引擎如InnoDB中被广泛应用。本文将深入探讨MVCC的基本概念,实现原理,并通过实例...

    Oracle事务概念及基础知识.pdf

    本文深入浅出地介绍了Oracle 事务的概念、特性和实际应用。 1. **事务概念** 事务是一个不可分割的操作序列,具有原子性,即事务中的所有操作要么全部执行,要么全部不执行。事务保证了数据库的一致性,确保在事务...

    sql事务全攻略,用实例介绍事务应用

    本资料“sql事务全攻略”深入浅出地探讨了这一主题,旨在帮助读者理解并掌握事务的应用。 1. **事务的基本概念** 事务是一组数据库操作,这些操作被视为一个逻辑工作单元,必须全部成功或全部失败。如果其中任何...

    【中文】【深入浅出Hibernate】【夏昕】【(PDF) 】

    ### Hibernate 深入浅出知识点解析 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(Object Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库操作的支持。通过 ...

    《分布式数据库技术金融应用规范》的技术架构及分布式事务核心功能的解读揭秘v1.0.pptx

    最后阐述对国内分布式事务数据库的发展历程和发展格局趋势预测,做到听众深入浅出掌握分布式事务数据库的技术架构、分布式事务原理及功能特性、分布式事务的测试验证方法,从分布式事务数据库的发展历程感知行业变化...

    浅谈InnoDB隔离模式的使用对MySQL性能造成的影响

    在某些情况下,调整事务隔离级别可能需要与业务逻辑相协调,以确保在性能和数据一致性之间找到平衡。 为了优化性能,可以考虑以下策略: 1. 使用适当的事务大小:尽量减少长事务,以减少锁的持有时间。 2. 调整MVCC...

    深入浅出解析mssql在高频,高并发访问时键查找死锁问题

    3. **调整事务隔离级别**:使用更宽松的隔离级别,如可重复读(READ UNCOMMITTED)或乐观并发模式,可以减少锁的使用,但可能会引入脏读或其他一致性问题。因此,这种方法需要谨慎评估。 4. **优化事务设计**:尽量...

Global site tag (gtag.js) - Google Analytics