首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JOOQ中使用@Transactional

在JOOQ中使用@Transactional
EN

Stack Overflow用户
提问于 2013-11-04 22:48:36
回答 1查看 1.4K关注 0票数 4

我正在尝试JOOQ,我的第一件事就是运行一个事务单元测试,该测试将自动回滚。我似乎没能把它弄到手,我也不知道从这里往哪里走。日志显示事务已启动并回滚。但是这些更改仍然被提交到数据库中。

如何使Spring中的事务正确地使用JOOQ?

代码语言:javascript
复制
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

我的测试看起来是:

代码语言:javascript
复制
@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上下文配置:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-05 08:32:41

默认情况下,MySQL (至少是旧版本)使用MyISAM作为表类型,此表类型不支持事务(支持选项见表14.7 )。您需要切换到InnoDB表,它确实支持事务。

资料来源: MySQL 文档

链接

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19778768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档