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

springBoot开启事务

问题: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

分享给朋友: