关于springboot中的事务注解

关于springboot中的事务注解,第1张

关于springboot中的事务注解

前: 在项目运行时,由于某条数据插入失败,发现事务未起作用

看了下启动类并没有加@EnableTransactionManagement注解开启事务

@EnableScheduling
@SpringBootApplication
@MapperScan(basePackages = "com.huofu.koudai.mapper")
@EnableConfigurationProperties(OssProperties.class)
@EnableTransactionManagement
public class AppApplication {

     public static void main(String[] args) {

          SpringApplication.run(AppApplication.class, args);
         }


    @Bean
    public OssTemplate ossTemplate(OssProperties properties) {
        return new OssTemplate(properties);
    }
}

在添加了注解后发现事务仍然不起作用,查阅资料后发现springboot的自动装配自动开启了事务管理

具体流程如下:

查看启动类的核心注解

找到自动装配注解

进入自动装配注解查看选择器

 继续进入选择器,查看选择器所导入的类,找到自动获得的Entity

找到该方法

 此方法传入一个元数据

此方法中的loadFactoryNames方法, 就是加载所有的组件的全限类

进入 loadFactoryNames方法,此方法第一个参数为类型,第二个参数为类加载器,返回值为本类的loadSpringFactories方法

 查看loadSpringFactories方法

getResources获取自动配置组件
public static final String FACTORIES_RESOURCE_LOCATION = "meta-INF/spring.factories";

找到public class AutoConfigurationimportSelector类所在的包,查看它的meta-INF文件,找到spring.factories文件:

 进入此文件我们可以看到,事务的自动装配配置类,当Springboot容器启动的时候,首先会扫描此文件,会自动为我们加载事务相关信息

因此,springboot项目并不需要@EnableTransactionManagement注解开启事务

接下来,继续查找事务不生效的原因:

最终查询到在Spring的Transactional的API文档中,有以下一段说明:

If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute (rolling back on runtime exceptions)

意思是:如果没有与异常相关的规则,它将被视为默认事务属性(即回滚运行时异常)。

因此需要指定注解属性为@Transactional(rollbackFor = Exception.class),这样,便可回滚所有异常.

总结:

① springboot自动装配会自动开启事务,不需要@EnableTransactionManagement注解开启事务

② spring声明式事务,需要在@Transactional注解添加rollbackFor指定回滚类型,否则默认只回滚运行时异常

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5708119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存