前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot事务管理

SpringBoot事务管理

作者头像
乐心湖
发布2020-07-31 16:42:18
1.2K0
发布2020-07-31 16:42:18
举报
文章被收录于专栏:MyTechnologyMyTechnology

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

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

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

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

代码语言:javascript
复制
<!-- 事务管理 -->
<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依赖(二选一即可):

代码语言:javascript
复制
<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属性信息

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @Transactional的使用
  • @Transactional属性信息
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档