【问题标题】:Using @Transactional with JOOQ在 JOOQ 中使用 @Transactional
【发布时间】:2013-11-15 17:22:05
【问题描述】:

我正在尝试 JOOQ,我首先想到的是运行一个将自动回滚的事务性单元测试。我似乎没有让它工作,我不知道从这里去哪里。日志显示事务已启动并回滚。但更改仍会提交到数据库。

如何使 Spring 中的事务在 JOOQ 中正常工作?

2013-11-04 23:41:14,353 [main] DEBUG DataSourceTransactionManager: Creating new transaction with name [insertPersons]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2013-11-04 23:41:14,369 [main] DEBUG DataSourceTransactionManager: Acquired Connection [jdbc:mysql://localhost/jooq-learn, UserName=jooq@localhost, MySQL-AB JDBC Driver] for JDBC transaction
2013-11-04 23:41:14,376 [main] DEBUG DataSourceTransactionManager: Switching JDBC Connection [jdbc:mysql://localhost/jooq-learn, UserName=jooq@localhost, MySQL-AB JDBC Driver] to manual commit
2013-11-04 23:41:14,507 [main] DEBUG DataSourceTransactionManager: Initiating transaction rollback
2013-11-04 23:41:14,508 [main] DEBUG DataSourceTransactionManager: Rolling back JDBC transaction on Connection [jdbc:mysql://localhost/jooq-learn, UserName=jooq@localhost, MySQL-AB JDBC Driver]
2013-11-04 23:41:14,509 [main] DEBUG DataSourceTransactionManager: Releasing JDBC Connection [jdbc:mysql://localhost/jooq-learn, UserName=jooq@localhost, MySQL-AB JDBC Driver] after transaction
2013-11-04 23:41:14,509 [main] DEBUG DataSourceUtils: Returning JDBC Connection to DataSource

我的测试看起来像:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(TestConstants.contextConfigFile)
public class JooqTest {

    private static final Logger logger = LoggerFactory.getLogger(JooqTest.class);

    private PersonService personService;


    @Inject
    public void setPersonService(PersonService personService) {
        this.personService = personService;
    }


    @Test
    @Transactional
    public void insertPersons() {
        PersonRecord john = new PersonRecord();
        john.setName("John");
        john.setAge(45);
        personService.save(john);
    }
}

我从 JOOQ 网站获取了 Spring 上下文配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
      init-method="createDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/jooq-learn"/>
    <property name="username" value="jooq"/>
    <property name="password" value="*****"/>
</bean>


<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>
</bean>


<bean id="transactionAwareDataSource"
      class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource"/>
</bean>


<bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
    <constructor-arg ref="transactionAwareDataSource"/>
</bean>


<bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
    <constructor-arg ref="config"/>
</bean>


<bean class="org.jooq.impl.DefaultConfiguration" name="config">
    <constructor-arg index="0" ref="connectionProvider"/>
    <constructor-arg index="1">
        <null/>
    </constructor-arg>
    <constructor-arg index="2">
        <null/>
    </constructor-arg>
    <constructor-arg index="3">
        <null/>
    </constructor-arg>
    <constructor-arg index="4">
        <null/>
    </constructor-arg>
    <constructor-arg index="5">
        <value type="org.jooq.SQLDialect">MYSQL</value>
    </constructor-arg>
    <constructor-arg index="6">
        <null/>
    </constructor-arg>
    <constructor-arg index="7">
        <null/>
    </constructor-arg>
</bean>

【问题讨论】:

  • 您是否正确设置了带有事务表的 MySQL?如果它们是不支持 MyISAM 事务,则需要 InnoDB 类型的表。您可以发布完整的测试用例而不仅仅是方法吗?
  • 是的,它确实是一个 MyISAM 表。我将重新创建表,看看会发生什么。我还更新了测试以包含整个测试用例。
  • 测试没问题,换表就行了
  • @M.Deinum 我切换到 InnoDB,现在它按预期工作。你拯救了我的一天:) 你能写一个答案,以便我可以适当地奖励你吗?

标签: java mysql spring transactions jooq


【解决方案1】:

MySQL(至少是旧版本)默认使用MyISAM作为表类型,这种表类型不支持事务(支持选项见表14.7)。您需要切换到支持事务的InnoDB 表。

来源:MySQLdocumentation

链接

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2018-01-26
    • 2017-02-08
    • 2021-10-19
    • 2017-07-11
    • 2018-12-15
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多