【问题标题】:No rollback on transaction - Spring Boot 2.0事务无回滚 - Spring Boot 2.0
【发布时间】:2018-09-03 08:12:42
【问题描述】:

我对 Spring Boot 2.0.0 有疑问。当我抛出 RuntimeException 时,它不会回滚事务。我正在使用具有相同设置的 Spring Boot 1.5.9 并且它有效。它刚刚迁移到 Spring Boot 2 并停止工作。

我的配置类:

@Configuration
@EnableJpaRepositories(basePackages = "com.test.repository")
@EnableTransactionManagement
public class DatabaseConfiguration {

    public static final String MODEL_PACKAGE = "com.test.model";

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() throws SQLException {
        org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl(this.url);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

我的商务舱:

@Service
public class TestBusinessImpl implements TestBusiness {

    @Override
    @Transactional
    public void save(final Test test) {
        this.testRepository.save(test);

        throw new RuntimeException("Test rollback");
    }

}

有人知道会发生什么吗?

【问题讨论】:

  • 附带说明,您配置了一个连接池,但没有进行任何连接验证。您至少应该使用 setTestOnBorrow(true),这是由 Spring 在自动配置中完成的。 Spring Boot 2.0 也切换到 HikariCP 作为首选池。
  • 我已简化以在此处发布配置。我用 HikariCP 进行了测试,但没有成功。交易继续进行而不回滚。
  • 当您使用org.springframework.transaction.interceptor=trace 登录时,您是否看到事务正常工作?是否有任何交易活动,例如开启交易?
  • 如果将事务放在 bean 管理的事务管理器中会发生什么?
  • @KarolDowbecki 是的,有交易活动:2018-03-25 02:10:51.202 TRACE 24185 --- [nio-8080-exec-3] ostiTransactionInterceptor : 为 [com. test.business.impl.TestBusinessImpl.save] / 2018-03-25 02:10:51.221 TRACE 24185 --- [nio-8080-exec-3] ostiTransactionInterceptor:获取 [org.springframework.data.jpa. repository.support.SimpleJpaRepository.save]

标签: java spring spring-boot


【解决方案1】:

您使用的是哪种方言?您必须指定spring.jpa.properties.hibernate.dialect

org.hibernate.dialect.MySQL5Dialect 不支持 Springboot 2.0 @Transaction

宁可使用 org.hibernate.dialect.MySQL5InnoDBDialect

【讨论】:

  • MySQL 支持多种存储引擎,InnoDB 就是其中之一。因此,您的解决方案可能仅在您匹配存储引擎集时才有效。参考 - dev.mysql.com/doc/refman/8.0/en/storage-engine-setting.html
  • InnoDB 是使用最广泛的具有事务支持的存储引擎。它是一个符合 ACID 的存储引擎。它支持行级锁定、崩溃恢复和多版本并发控制。它是唯一提供外键参照完整性约束的引擎。 Oracle 建议对表使用 InnoDB,特殊用例除外。
  • 我将方言更改为 MySQL5InnoDBDialect 并且它有效。谢谢@user3531698
  • @user3531698:它也对我有用。我被这个问题困了几个小时。终于搞定了。
猜你喜欢
  • 2018-11-05
  • 2020-03-11
  • 2016-10-07
  • 2017-11-07
  • 2018-03-25
  • 2011-11-21
  • 2020-02-06
  • 1970-01-01
  • 2018-01-01
相关资源
最近更新 更多