美文网首页
Spring的声明式事务

Spring的声明式事务

作者: 赵镇 | 来源:发表于2017-08-30 08:22 被阅读90次

Spring的声明式事务即使用@Transactional注解的方式来标明该方法需要事务支持。
当使用Spring的事务管理的时候,需要特别注意的是@Transactional注解来自org.springframework.transaction.annotation包而不是javax.transaction。Spring提供了一个EnableTransactionManagement注解配置在配置类上来开启声明式事务的支持,使用了该注解后Spring会自动扫描@Transactional追。

注解事务行为

事务的传播行为

  • REQUIRED:表示业务方法需要在一个事务中处理,如果业务方法执行时已经在一个事务中,则加入该事务,否则重新开启一个事务。这也是默认的事务传播行为;

  • NOT_SUPPORTED:声明业务方法不需要事务,如果业务方法执行时已经在一个事务中,则事务被挂起,等方法执行完毕后,事务恢复进行;

  • REQUIRES_NEW:表明业务方法需要在一个单独的事务中进行,如果业务方法进行时已经在一个事务中,则这个事务被挂起,并重新开启一个事务来执行这个业务方法,业务方法执行完毕后,原来的事务恢复进行;

  • MANDATORY:该属性指定业务方法只能在一个已经存在的事务中进行,业务方法不能发起自己的事务;如果业务方法没有在一个既有的事务中进行,容器将抛出异常;

  • SUPPORTS:该属性指定,如果业务方法在一个既有的事务中进行,则加入该事务;否则,业务方法将在一个没有事务的环境下进行;

  • NEVER:指定业务方法不可以在事务中进行,如果业务方法执行时已经在一个事务中,容器将抛出异常;

  • NESTED:该属性指定,如果业务方法在一个既有的事务中执行,则该业务方法将在一个嵌套的事务中进行;否则,按照REQUEIRED来对待。它使用一个单独的事务,这个事务可以有多个rollback点,内部事务的rollback对外部事务没有影响,但外部事务的rollback会导致内部事务的rollback。这个行为只对DataSourceTransactionManager有效。

事务的隔离级别

使用@Transactional的Isolation属性可以指定事务的隔离级别。但事务的隔离级别是由底层的数据库实现的,并不是由Spring来实现。

  • READ_UNCOMMITTED:会出现脏读、不可重复读和幻读问题;

  • READ_COMMITTED:会出现不可重复读和幻读问题;

  • REPEATABLE_READ:会出现幻读问题;

  • SERIALIZABLE:串行化,不会出现上面的问题。

    一般的数据库默认提供的是READ_COMMITTED隔离级别,如sqlserver2000;Mysql默认提供的是REPEATABLE_READ。


    这里写图片描述

默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;
而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 ,如下:

@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
    public void methodName() {
       throw new Exception("注释");
       
    }
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
    public ItimDaoImpl getItemDaoImpl() {
        throw new RuntimeException("注释");
    } 

类级别使用@Transactional

@Transactional不仅可以注解在方法上,也可以注解在类上,当注解在类上的时候,表明此类的所有public方法都是开启事务的,如果类级别和方法级别同时使用了@Transactional注解,则使用在类级别的注解会重载方法级别的注解。在使用类级别注解的时候,推荐将类中的select查询方法同时加上@Transactional(readOnly=true)属性。

Spring Data JPA的事务支持

Spring Data JPA对所有默认的方法都开启了事务支持,且对所有的查询类事务默认启用readOnly=true属性。这一点可以去看SimpleJpaRepository的源码。的确如此。

Spring Boot的事务支持

自动配置的事务管理器

在使用JDBC作为数据访问技术的时候,SpringBOOT为我们定义PlatformTransactionManager的实现DataSourceTransactionManager的Bean,配置见org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration.class类中的定义.
  在使用JPA作为数据访问的技术的时候,SpringBoot为我们定义了一个PlatformTransactionManager的实现JpaTransactionManager的Bean,配置见org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class类中的定义

自动开启注解事务的支持

Spring Boot专门用于配置事务的类为org.springframework.boot.autoconfigure.jdbc.transaction.TransactionAutoConfiguration,此配置类依赖于JpaBaseConfiguration和DataSourceTransactionManagerAutoConfiguration。而在DataSourceTransactionManagerAutoConfiguration配置里还开启了对声明式事务的支持。所以在Spring Boot中无需显示启用@EnableTransactionManagement注解。

参考书籍 JavaEE开发的颠覆者-SpringBoot实战

相关文章

  • spring04

    Spring JdbcTemplate学习 Spring 声明式事务 xml配置实现 Spring 声明式事务 注...

  • Spring的事务机制解析一

    一Spring事务的种类 1.声明式事务 2.编程式事务 二Spring事务的具体描述 (一)声明式事务 1.声明...

  • 手写源码(一):自己实现Spring事务

    手写Spring事务 Spring事务分为声明式事务(注解或包扫描)和编程式(在代码里提交或回滚)事务,声明式事务...

  • spring事务(二) 声明式事务

    spring事务(二) 声明式事务 知识导读 声明式事务是对编程式事务的包装 声明式事务通过使用AOP来实现,注册...

  • Spring 事务机制详解

    Spring事务机制主要包括声明式事务和编程式事务 Spring声明式事务时,有一个非常重要的概念就是事务属性。事...

  • Java Spring-声明式事务

    Spring-声明式事务

  • spring事务管理 TransactionProxyFacto

    J2EE,当然离不开事务,事务又当然少不了Spring声明式事务。spring声明式事务,很多码农门,应该和笔者一...

  • Spring事务总结

    1. 编程式事务和声明式事务 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务Spring推荐...

  • spring 声明式事务管理

    本节阐述在事务相关的问题上,Spring框架的声明式事务管理的内部工作原理。 关于Spring框架的声明式事务支持...

  • Spring Boot开启声明式事务

    Spring Boot开启声明式事务 在以前早期的Spring使用xml方式的时候,配置声明式事务通常用xml方式...

网友评论

      本文标题:Spring的声明式事务

      本文链接:https://www.haomeiwen.com/subject/vvdzdxtx.html