spring boot中的@Transactionnal注解真的会创建事务吗?

Posted

技术标签:

【中文标题】spring boot中的@Transactionnal注解真的会创建事务吗?【英文标题】:@Transactionnal annotation in spring boot does it really create a transaction? 【发布时间】:2021-11-25 14:39:01 【问题描述】:

我想用一种方法调用与我的数据库交互的不同方法。

类似这样的:

@Autowired
EnteteService es; // service for jpaRepository 

@Autowired
SystemOracleServiceJpa so; // service using  jdbcTemplate

@Autowired
DetailService ds; // service for jpaRepository 


@Transactional
public void configure(EnteteAR entete) throws ConfigurationException 
    try
        
        this.es.save(entete); // first methode 
        List<DetailAR> details = this.so.getStructure(entete.getTableName());
        if(details.size()>0)
                this.ds.saveAllDetails(details); // second  
                this.so.CreateTable(details, entete.getTableName(), "DEM");//third 
                this.so.createPkIdxDem(entete.getTableName()); // fourth 
                this.so.CreateTable(details, entete.getTableName(), "BACK"); // fifth 
        
        else
            throw new ConfigurationException("Configuration error");

        
        
        
        
    catch(Exception e)
        throw new ConfigurationException(e.getMessage());

        
    
    
    

只有当我的主要方法“配置”中的所有这些方法都没有出现错误时,我才想提交。

我在想@transactionnal 注释为此工作,但在内部的每个方法之后提交。

示例:

如果 this.es.save 有效而 this.ds.saveAllDetails 无效,我会在数据库中找到 es.save 的数据:(

有人可以帮帮我吗?

提前感谢您的阅读和您的潜在帮助。

【问题讨论】:

【参考方案1】:

@Transactional 将在执行的方法抛出未经检查的异常时自动调用回滚。

在您的情况下,ConfigurationException 是一个检查异常,因此它不起作用。

您可以通过将注释修改为来使其工作

      @Transactional(rollbackOn = ConfigurationException.class)
      public void configure(EnteteAR entete) throws ConfigurationException 
         try ....

【讨论】:

@10hamrani 如果解决了问题,请接受答案 我怎样才能接受它? :p 我是新来的。 @10hamrani ***.com/help/someone-answers

以上是关于spring boot中的@Transactionnal注解真的会创建事务吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 / Kotlin / JDK9 - 引起:java.lang.ClassNotFoundException:javax.transaction.SystemExceptio

Spring Transaction:如果我不在方法上给出@Transaction 注释会发生啥

spring boot - 管理事务和多个数据源

spring boot -- 事务

用于过滤两个子实体的 Spring Boot 规范

聊一聊Spring中的 Transaction基本实现