【发布时间】: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