Jooq 不使用春季交易

Posted

技术标签:

【中文标题】Jooq 不使用春季交易【英文标题】:Jooq not working with spring transactions 【发布时间】:2019-02-14 23:20:55 【问题描述】:

我尝试使用带有 Spring JDBC 的 Jooq 进行设置,除事务外一切正常。

这是我目前的设置:

@Configuration
public class DALConfig 

    @Value("$jdbcUrl")
    String jdbcUrl;

    @Value("$username")
    String username;

    @Value("$password")
    String password;

    @Bean(destroyMethod = "close")
    DataSource getDataSource() 
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(jdbcUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    

    @Bean(name="transactionManager")
    DataSourceTransactionManager getDataSourceTransactionManager() 
        return new DataSourceTransactionManager(getDataSource());
    

    @Bean(name="transactionAwareDataSource")
    TransactionAwareDataSourceProxy getTransactionAwareDataSourceProxy() 
        return new TransactionAwareDataSourceProxy(getDataSource());
    

    @Bean(name="connectionProvider")
    DataSourceConnectionProvider getDataSourceConnectionProvider() 
        return new DataSourceConnectionProvider(getTransactionAwareDataSourceProxy());
    

    @Bean
    DefaultDSLContext getDefaultDSLContext() 
        return new DefaultDSLContext(getConfiguration());
    

    @Bean
    DefaultConfiguration getConfiguration() 
        DefaultConfiguration config = new DefaultConfiguration();
        config.set(SQLDialect.MYSQL);
        config.setConnectionProvider(getDataSourceConnectionProvider());
        return config;
    

    @Bean
    CourseDao getCourseDao() 
        return new CourseDao(getConfiguration());
    

我在插入新课程的方法上使用@Transactional(propagation = Propagation.MANDATORY) 注释,但我收到以下异常org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'。 我已经阅读了 spring 和 jooq 的文档,但我无法弄清楚缺少什么以及如何解决这个问题。有人可以指出我在这里缺少什么。

【问题讨论】:

@Transactional(propagation = Propagation.MANDATORY) 表示必须有一个事务,否则它不会创建一个。 即使我使用propagation = Propagation.REQUIRED(如果不存在则创建一个新事务),我看不到任何回滚并且事务不起作用。在这种情况下,我没有得到任何异常。 【参考方案1】:

好的,我遇到了问题,应该回滚事务的异常发生在事务范围之外。如果我在包含异常的范围内添加了@Transactional,则回滚工作正常。 此外,propagation 应为 Propagation.MANDATORY 应更改为 Propagation.REQUIRED(这是默认值)。

【讨论】:

以上是关于Jooq 不使用春季交易的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ & 交易

使用 scala 在 Jooq 中进行交易和条件更新

春季交易中的一个连接?

java 春季4+特别交易

多个存储库上的 JOOQ @Transactional

JOOQ 插入记录列表