MENU

SpringBoot事务管理

• March 17, 2020 • Read: 63 • 技术笔记,SpringBoot

下面的图片来自网络,或许可以帮你很好的理清楚思路。

值得一提的是,事务为什么要放在Service层呢,我们进行事务管理的目的就是为了使几个对持久层的操作要么都成功,要么都失败,而不是一个失败一个成功,这样子数据就会出现很多问题,比如脏读、不可重复读、幻读

首先我们先了解下Spring的事务管理的使用。常见的都会用xml的配置方式来使用Spring AOP切面编程,把事务以切面的方式注入到Service层。

我们首先配置了事务管理器(txManager),传入数据源(dataSource),配置事务通知(txAdivce),最后将【事务管理器】切入需要进行事务管理的Service方法中。

<!-- 事务管理 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
 
<!-- 事务通知(隔离级别、传播行为) -->
<tx:advice id="txAdivce" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="insert*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="save*" propagation="REQUIRED"/>
        
        <tx:method name="find*" read-only="false"/>
        <tx:method name="get*" read-only="false"/>
    </tx:attributes>
</tx:advice>
 
<!-- 切入事务 -->
<aop:config>
    <aop:pointcut expression="execution(* com.*.service.*.*(..))" id="txPointcut"/>
    <aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/>
</aop:config>

而Spring Boot中的推荐操作是使用@Transactional注解来申明事务。要在Spring boot中支持事务,首先要导入Spring boot提供的JDBC或JPA依赖(二选一即可):

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
   <scope>test</scope>
</dependency>
 
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
   <scope>test</scope>
</dependency>

Spring Boot会自动默认分别注入DataSourceTransactionManager或者是JpaTransactionManager,
并进行一系列的事务初始化操作,所以我们不需要任何额外配置。直接使用@Transactional注解进行事务管理。

不过在传统的工程中也可以使用@Transactional注解来申明事务,但是使用XML来配置事务管理器(DataSourceTransactionManager)是必不可少的。

Spring Boot会自动到Spring容器中寻找我们配置好的DataSource。

@Transactional的使用

  • @Transactional不仅可以注解在方法上,也可以注解在类上。
  • @Transactional 注解应该只被应用到 public 方法上。
  • 当注解在类上的时候意味着此类的所有public方法都是开启事务的。
  • 如果类级别和方法级别同时使用了@Transactional注解,则使用在类级别的注解会重载方法级别的注解。

在SpringBoot中使用@Transactional注解需要在启动类上添加@EnableTransactionManagement注解开启事务支持。

@Transactional属性信息

本站所有未注明转载的文章均为原创,并采用CC BY-NV-SA 4.0 授权协议,转载请注明来源。

Archives QR Code
QR Code for this page
Tipping QR Code