`

【转】事务必知必会

 
阅读更多

http://blog.csdn.net/it_man/article/details/5074371

 

Spring5种事务隔离级别:

隔离级别 含义
ISOLATION_DEFAULT 使用数据库默认的事务隔离级别
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读
ISOLATION_READ_COMMITTED 允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生
ISOLATION_REPEATABLE_READ 对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生
ISOLATION_SERIALIZABLE 完全服从ACID隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低。

 

Spring7种事务传播行为:

传播行为 含义
PROPAGATION_REQUIRED(XML文件中为REQUIRED) 表示当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。(如果被调用端发生异常,那么调用端和被调用端事务都将回滚
PROPAGATION_SUPPORTS(XML文件中为SUPPORTS) 表示当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行
PROPAGATION_MANDATORY(XML文件中为MANDATORY) 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常
PROPAGATION_NESTED(XML文件中为NESTED) 表示如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同PROPAGATION_REQUIRED的一样
PROPAGATION_NEVER(XML文件中为NEVER) 表示当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常
PROPAGATION_REQUIRES_NEW(XML文件中为REQUIRES_NEW) 表示当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行
PROPAGATION_NOT_SUPPORTED(XML文件中为NOT_SUPPORTED) 表示该方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执行

 

 

工作休息之余,看了公众号发来的推荐信息,关于事务这篇讲得不错,通俗易懂。

第二篇:https://my.oschina.net/huangyong/blog/160012?p=2&temp=1476763581888#blog-comments-list

 

 

第三篇深入讲解:http://lelglin.iteye.com/blog/1901901

 

比较全,图片:http://jinnianshilongnian.iteye.com/blog/1441271

Required:必须有逻辑事务,否则新建一个事务,使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务,如图9-2和9-3所示;

 

图9-2 Required传播行为

 

图9-3 Required传播行为抛出异常情况

在前边示例中就是使用的Required传播行为:

一、在调用userService对象的save方法时,此方法用的是Required传播行为且此时Spring事务管理器发现还没开启逻辑事务,因此Spring管理器觉得开启逻辑事务,

二、在此逻辑事务中调用了addressService对象的save方法,而在save方法中发现同样用的是Required传播行为,因此使用该已经存在的逻辑事务;

三、在返回到addressService对象的save方法,当事务模板类执行完毕,此时提交并关闭事务。

       因此userService对象的save方法和addressService的save方法属于同一个物理事务,如果发生回滚,则两者都回滚。

 

RequiresNew:创建新的逻辑事务,使用PROPAGATION_REQUIRES_NEW指定,表示每次都创建新的逻辑事务(物理事务也是不同的)如图9-4和9-5所示:

 

图9-4 RequiresNew传播行为

 

图9-5 RequiresNew传播行为并抛出异常

该传播行为执行流程(正确提交情况):

一、当执行userService对象的save方法时,由于传播行为是RequiresNew,因此创建一个新的逻辑事务(物理事务也是不同的);

二、当执行到addressService对象的save方法时,由于传播行为是RequiresNew,因此首先暂停上一个逻辑事务并创建一个新的逻辑事务(物理事务也是不同的);

三、addressService对象的save方法执行完毕后,提交逻辑事务(并提交物理事务)并重新恢复上一个逻辑事务,继续执行userService对象的save方法内的操作;

四、最后userService对象的save方法执行完毕,提交逻辑事务(并提交物理事务);

五、userService对象的save方法和addressService对象的save方法不属于同一个逻辑事务且也不属于同一个物理事务。

 

 

Supports:支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务,如果当前没有逻辑事务,就以非事务方式执行,如图9-6和9-7所示:

 

图9-6 Required+Supports传播行为

 

       图9-7 Supports+Supports传播行为

 

 

NotSupported:不支持事务,如果当前存在事务则暂停该事务,使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行,如图9-8和9-9所示:

 

       图9-8 Required+NotSupported传播行为

 

       图9-9 Supports+NotSupported传播行为

 

 

Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出异常(IllegalTransactionStateException),如图9-10和9-11所示:

 

       图9-10 Required+Mandatory传播行为

 

       图9-11 Supports+Mandatory传播行为

 

 

 

Never:不支持事务,如果当前存在是事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常(IllegalTransactionStateException),如图9-12和9-13所示:

 

       图9-12 Required+Never传播行为

 

       图9-13 Supports+Never传播行为

 

 

 

Nested:嵌套事务支持,使用PROPAGATION_NESTED指定,如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚,如图9-14和9-15所示:

 

       图9-14 Required+Nested传播行为

 

图9-15 Nested+Nested传播行为

 

Nested和RequiresNew的区别:

1、  RequiresNew每次都创建新的独立的物理事务,而Nested只有一个物理事务;

2、  Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚,而 RequiresNew由于都是全新的事务,所以之间是无关联的;

3、  Nested使用JDBC 3的保存点实现,即如果使用低版本驱动将导致不支持嵌套事务。

使用嵌套事务,必须确保具体事务管理器实现的nestedTransactionAllowed属性为true,否则不支持嵌套事务,如DataSourceTransactionManager默认支持,而HibernateTransactionManager默认不支持,需要我们来开启。

  • 事务超时:设置事务的超时时间,单位为秒,默认为-1表示使用底层事务的超时时间;

         使用如setTimeout(100)来设置超时时间,如果事务超时将抛出org.springframework.transaction.TransactionTimedOutException异常并将当前事务标记为应该回滚,即超时后事务被自动回滚;

         可以使用具体事务管理器实现的defaultTimeout属性设置默认的事务超时时间,如DataSourceTransactionManager. setDefaultTimeout(10)。

 

  • 事务只读:将事务标识为只读,只读事务不修改任何数据;

         对于JDBC只是简单的将连接设置为只读模式,对于更新将抛出异常;

         而对于一些其他ORM框架有一些优化作用,如在Hibernate中,Spring事务管理器将执行“session.setFlushMode(FlushMode.MANUAL)”即指定Hibernate会话在只读事务模式下不用尝试检测和同步持久对象的状态的更新。

         如果使用设置具体事务管理的validateExistingTransaction属性为true(默认false),将确保整个事务传播链都是只读或都不是只读,如图9-16是正确的事务只读设置,而图9-17是错误的事务只读设置:

 

图9-16 正确的事务只读设置

 

 

图9-17 错误的事务只读设置

如图10-17,对于错误的事务只读设置将抛出IllegalTransactionStateException异常,并伴随“Participating transaction with definition [……] is not marked as read-only……”信息,表示参与的事务只读属性设置错误。

 

 

 

  • 大小: 66.4 KB
分享到:
评论

相关推荐

    必知必会mysql学习.zip

    "必知必会MySQL学习"的压缩包文件显然旨在提供一个全面的学习资源,帮助初学者或进阶者深入理解MySQL的核心概念和技术。在这个教程中,我们可以期待涵盖以下几个关键知识点: 1. **基础概念**:首先,我们会学习...

    MYSQL必会必知

    标题《MYSQL必会必知》指出了本文的重点在于介绍MySQL数据库的基础知识,强调了学习MySQL的必要性。描述部分重复强调了“mysql基础”,可能是由于文档错误,不过这仍然突出了本文的主旨:掌握MySQL的基础操作和概念...

    SQL语言(必知必会)第四版

    《SQL语言(必知必会)第四版》是一本针对SQL初学者和进阶者的重要教程,涵盖了SQL语言的核心概念和实用技巧。SQL,全称Structured Query Language,即结构化查询语言,是用于管理和处理关系数据库的标准编程语言。...

    SQL必知必会-中文-第4版.pdf_sql_ThisIsABook_

    《SQL必知必会》是数据库领域的一本经典著作,主要针对SQL(Structured Query Language,结构化查询语言)进行深入浅出的讲解。SQL是用于管理和处理关系数据库的标准语言,对于任何想要从事与数据打交道的工作的人来...

    SQL必知必会 第四版

    《SQL必知必会 第四版》是一本深入学习SQL语言的经典教材,旨在帮助读者全面理解和掌握数据库查询语言的核心概念与技巧。这本书以其清晰的结构、实用的例子和易懂的解释,深受广大IT专业人士和学习者的喜爱。"高清非...

    MySql从零开始学-必知必会

    本教程将基于提供的两个资源——《MySQL5.5从零开始学》和《mysql必知必会》,全面介绍MySQL的学习路径,涵盖基础到优化的全过程。 一、MySQL基础 1. 数据库与表的概念:理解数据库作为数据的集合体,以及表作为...

    SQL必知必会(第四版)

    《SQL必知必会》第四版是一本专为数据库初学者设计的教程,它以其基础、易懂和实践性强的特点,成为了许多人学习SQL语言的首选。SQL,全称Structured Query Language,即结构化查询语言,是用于管理和处理关系数据库...

    MySQL 必知必会 21-30.pdf

    本摘要涵盖了MySQL必知必会的第21至30章,主要知识点如下: 1. **创建和操纵表**: - `CREATE TABLE` 用于创建新表,例如示例中的`orderitems`表,包括自增主键(AUTO_INCREMENT)和非空约束(NOT NULL)。 - `...

    sql必知必会第四版原版

    根据提供的文件信息,这里主要涉及的是《SQL必知必会》第四版这本书的相关知识点介绍。由于文件中的部分内容并未提供该书的具体章节或知识点,因此,下面将基于标题、描述及可能涉及的一些基本SQL概念来进行详细阐述...

    sql 必知必会 第三版

    《SQL必知必会》是数据库管理领域的一本经典教程,尤其在第三版中,它进一步完善了对SQL语言的讲解,涵盖了多个主流数据库系统,包括MySQL、Oracle和Microsoft SQL Server。这本书旨在帮助读者深入理解SQL语言的基础...

    SQL必知必会 第4版

    《SQL必知必会》第四版是一本深受程序员和数据分析师喜爱的经典教程,它全面而深入地介绍了SQL语言,帮助读者掌握查询、管理和分析数据库的关键技能。这本书以其清晰的讲解和丰富的实例,使得无论是初学者还是有经验...

    mysql必知必会数据库

    在深入探讨MySQL之前,我们先来理解一下“mysql必知必会数据库”这个主题。这本书提供了一种实用的方法,让读者能够掌握MySQL的基础知识,并通过实际操作来提升对数据库管理的理解。 MySQL的核心概念包括数据模型、...

    SQL必知必会第4版PDF(附MySQL样例表脚本)

    《SQL必知必会》是数据库查询语言SQL的经典学习指南,第4版更是结合了最新的技术发展和实践经验,为读者提供了全面且深入的学习资源。这本书不仅涵盖了SQL的基础知识,还探讨了高级特性和实践技巧,旨在帮助读者成为...

    SQL必知必会 第三版

    《SQL必知必会》是数据库查询语言SQL的学习经典,第三版更加完善和全面,适合初学者和进阶者提升SQL技能。这本书深入浅出地介绍了如何使用SQL进行数据操作、查询、分析以及数据管理。以下是一些核心知识点: 1. **...

    SQL必知必会 第四版 文中案例脚本(MySQL版)

    《SQL必知必会》第四版是一本深受程序员和数据分析师喜爱的经典教程,它全面而深入地介绍了SQL语言,特别是针对MySQL数据库系统进行了实例演示。这本书的案例脚本提供了丰富的实践机会,帮助读者巩固和深化对SQL的...

    SQL必知必会 第4版,html文档

    《SQL必知必会》是数据库查询语言SQL的学习经典,其第4版更是深受广大IT从业者和学习者喜爱。此HTML文档版本为读者提供了方便的在线阅读和学习体验。SQL,全称Structured Query Language(结构化查询语言),是用于...

    读书笔记系列1——MySQL必知必会.pdf

    《MySQL必知必会》这本书提供了全面的MySQL基础知识,涵盖了从数据库基础到高级功能的诸多方面。以下是根据书中的章节内容概述的一些关键知识点: 1. **数据库基础**: - **数据库**:是一个组织化的数据存储单元...

    SQL必知必会(第三版)及源代码

    《SQL必知必会》是数据库初学者及进阶者不可或缺的一本经典教材,尤其在第三版中,作者深入浅出地介绍了SQL语言的核心概念和实际应用。这本书以实用性为出发点,旨在让读者掌握SQL的基本操作,从而能有效地与各种...

Global site tag (gtag.js) - Google Analytics