当前位置:首页 > Java技术 > springBoot开启事务

springBoot开启事务

2022年11月08日 20:41:18Java技术7

问题:springboot的EnableTransactionManagement这注解是不是多余的?

之前看到网上说springBoot项目要用事务,需要在启动类加上@EnableTransactionManagement。
但是我发现我的项目都没加,一样可以用@Transactional注解来控制事务,所以就研究了下。

若按网上所说的就需要做下面两步:

①在启动类加上@EnableTransactionManagement
package com.zcw;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

②在访问数据库的Service方法上加注解
@Transactional(rollbackFor = Exception.class)
public void registerUser(User user) throws Exception {
   ...
   userMapper.updateUser(user);
   ...
}

其实启动类不加上@EnableTransactionManagement,也是可以用@Transactional注解的,因为:@SpringBootApplication的自动配置已经配置好了。

~/org/springframework/boot/spring-boot-autoconfigure/2.3.0.RELEASE/spring-boot-autoconfigure-2.3.0.RELEASE.jar!/META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
/**
 * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
 * Auto-configuration} for Spring transaction.
 *
 * @author Stephane Nicoll
 * @since 1.3.0
 */
@Configuration
@ConditionalOnClass(PlatformTransactionManager.class)
@AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
		DataSourceTransactionManagerAutoConfiguration.class,
		Neo4jDataAutoConfiguration.class })
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {

	......

	@Configuration
	@ConditionalOnBean(PlatformTransactionManager.class)
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
	public static class EnableTransactionManagementConfiguration {

		@Configuration
		@EnableTransactionManagement(proxyTargetClass = false)  //这里其实已经加了
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class",
				havingValue = "false", matchIfMissing = false)
		public static class JdkDynamicAutoProxyConfiguration {

		}

		@Configuration
		@EnableTransactionManagement(proxyTargetClass = true)  //这里其实已经加了
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class",
				havingValue = "true", matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {

		}

	}

}

附:@Transactional参数说明: 

springBoot开启事务 _ JavaClub全栈架构师技术笔记


1 Spring中 纯XML 配置事务

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="pooledDataSource"/>
</bean>
<aop:config>
    <aop:pointcut expression="execution(* cn.yuanyu.crud.service..*(..))" id="txPoint"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
        <tx:method name="get*" read-only="true"/>
    </tx:attributes>
</tx:advice>


2 Spring中 XML+注解 配置事务

一般xml里面配置粗粒度的控制,然后使用注解

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="pooledDataSource"/>
</bean>
<!-- 定义切入点,expression为切人点表达式,如下是指定service包下的所有方法,具体以自身实际要求自定义  -->
<aop:config>
    <aop:pointcut expression="execution(* cn.yuanyu.crud.service..*(..))" id="txPoint"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
<!-- <tx:advice>定义事务通知,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过<tx:attributes>指定具体需要拦截的方法-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--<tx:method>拦截方法,其中参数有:
            name:方法名称,将匹配的方法注入事务管理,可用通配符
            propagation:事务传播行为,
            isolation:事务隔离级别定义;默认为“DEFAULT”
            timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统;
            read-only:事务只读设置,默认为false,表示不是只读;
            rollback-for:需要触发回滚的异常定义,可定义多个,以“,”分割,默认RuntimeException都将导致事务回滚;
            no-rollback-for:不被触发进行回滚的 Exception(s);可定义多个,以“,”分割;
          -->
        <tx:method name="*"/>
        <tx:method name="get*" read-only="true"/>
    </tx:attributes>
</tx:advice>

<tx:annotation-driven transaction-manager="transactionManager"/>//开启事务注解


3 Spring中 纯注解 配置事务

@Configuration //声明配置类
@MapperScan("cn.yuanyu.tx.mapper")
@EnableTransactionManagement // 开启事务注解,等同于配置文件<tx:annotation-driven/>
public class MybatisPlusConfiguration {
    

@Transactional()
public void registerUser(User user) throws Exception {
   ...
}

作者:记忆储存处
来源链接:https://blog.csdn.net/qq_34357018/article/details/120504009

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68591.html

分享给朋友:

“springBoot开启事务” 的相关文章

Spring Boot 2.0 WebFlux 快速入门实践

Spring Boot 2.0 WebFlux 快速入门实践

02:WebFlux 快速入门实践 Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顾名思义,是...

SpringCloud 实战|7.SpringCloud 整合Sentinel

SpringCloud 实战|7.SpringCloud 整合Sentinel

手把手教你从0开始搭建spring cloud alibaba 脚手架,关注公众号“AI码师” 获取项目完整源码 引言 这一期主要是整合sentinel,实现流控、降级和授权功能 开整 引入依赖 在comm...

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!...

springboot启动报:Error creating bean with name 'dataSource' defined in class path resource

需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.class},排除此类的autoconfig。启动以后就可以正常运行。 ...

JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

Spring Boot 日志篇 1、日志框架(故事引入) 小张;开发一个大型系统; ​ 1、System.out.println("");将关键数据打印在控制台;去掉?写在一个文件? ​ 2、框架来记录系统的一些运行时信息;日志框架 ; zhangloggin...

spring结合Mybatis的框架搭建(一)

spring结合Mybatis的框架搭建(一)

一:前沿   2015年新年上班的第二天,第一天就打了一天的酱油哦,只是下午开始搭建自己毕业设计的框架,搭建的是spring+spring mvc+MyBatis的框架。今天遇到了一个问题,结果弄了我一天时间,所以啊,路还是的一步步的走,弄过了才知道是怎么回事。现在记载下这个问题...

再谈spring的循环依赖是怎么造成的?

再谈spring的循环依赖是怎么造成的?

  老生常谈,循环依赖!顾名思义嘛,就是你依赖我,我依赖你,然后就造成了循环依赖了!由于A中注入B,B中注入A导致的吗?   看起来没毛病,然而,却没有说清楚问题!甚至会让你觉得你是不清楚spring的循环依赖的!   那么,spring的循环依赖到底是啥玩意? 来看...

springcloud zookeeper+gateway

springcloud zookeeper+gateway

搭建springcloud项目的时候以 zookeeper为注册中心  gateway为路由 启动时出现以下报错:   ********************************************************** Sprin...

项目ITP(五) spring4.0 整合 Quartz 实现任务调度

项目ITP(五) spring4.0 整合 Quartz 实现任务调度

2014-05-16 22:51 by Jeff Li 前言   系列文章:[传送门]   项目需求:     二维码推送到一体机上,给学生签到扫描用。然后需要的是 上课...

spring常见错误:Error creating bean with name ‘xxx‘

spring常见错误:Error creating bean with name ‘xxx‘

 Error creating bean with name 'userController': Injection of autowired dependencies failed; nested exception is org.springframework.be...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。