【问题标题】:spring-jooq with transaction not working事务不工作的spring-jooq
【发布时间】:2017-09-21 03:01:57
【问题描述】:

将 spring 与 jooq 集成时,事务性声明性回滚功能不起作用。我在 application-context.xml 中的设置如下

<bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <qualifier value="tx-jooqtest"/>
     <property name="dataSource" value="#{jooqtest.getDataSource()}"/>
</bean>

<bean id="jooqtest" class="com.vassarlabs.datasource.service.impl.VLDataSource">
    <property name="dataStoreName" value="jooqtest" />
</bean>

然后我有一个带有事务标记的方法,如下所示

@Transactional(value = "tx-jooqtest" , rollbackFor = DataAccessException.class)
public void testTransaction() {
    DSLContext dslContext = null;

       dslContext = DSL.using(dtSource.getDataSource(), SQLDialect.MYSQL);
    String sql = "insert into food (kind) values ( ? )";            
    dslContext.execute(sql ,new Object[]{"Its a whole next level kind "} );                     
    insert2();}

在 insert2() 方法中我抛出 DataAccessExcpetion ,但事务没有回滚。我是否必须在 application-context xml 中设置任何其他属性才能使其工作。

【问题讨论】:

  • 为了记录,这个问题也被问到jOOQ manual
  • 我认为为了让某人能够回答这个问题(无论是在 Stack Overflow 上还是在 jOOQ 手册上),您需要添加以下代码:insert2(),您的 VLDataSource .我仍然认为您的问题在 VLDataSource 之内,但是从您到目前为止提供的信息中很难判断。
  • 似乎缺少一些配置。而不是 DSL.using(dataSource , dialect) ,我必须在 application-context.xml 中使用 DSL.using(connProvider , dialect) 和以下属性。 &lt;bean id="transactionAwareDataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"&gt; &lt;constructor-arg value="#{jooqtest.getDataSource()}" /&gt; &lt;/bean&gt; &lt;bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider"&gt; &lt;constructor-arg ref="transactionAwareDataSource" /&gt; &lt;/bean&gt;

标签: spring spring-transactions jooq


【解决方案1】:

似乎 application-context.xml 中缺少某些属性。为了让 jooq 意识到 spring 事务与 jooq 是同一事务的一部分,我们必须创建一个连接提供程序 bean,它通过 TransactionAwareDataSourceProxy 引用数据源。更新的代码和配置如下

 @Transactional(value = "tx-jooqtest" , rollbackFor = DataAccessException.class)                                           
     public void testTransaction() {
     DSLContext dslContext = null;
     dslContext = DSL.using(connProvider, SQLDialect.MYSQL);
     String sql = "insert into food (kind) values ( ? )";            
      dslContext.execute(sql ,new Object[]{"Its a whole next level kind "} 
    );                     
    insert2();}

平台应用程序上下文.xml

    <bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <qualifier value="tx-jooqtest"/>
         <property name="dataSource" value="#{jooqtest.getDataSource()}"/>
    </bean>

    <bean id="jooqtest" class="com.vassarlabs.datasource.service.impl.VLDataSource">
        <property name="dataStoreName" value="jooqtest" />
    </bean>
<bean id="transactionAwareDataSource"
        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <constructor-arg value="#{jooqtest.getDataSource()}" />
    </bean>

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

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 2017-02-20
    • 2015-12-29
    • 2019-01-10
    • 2013-03-08
    • 2017-08-19
    • 2023-03-24
    • 2016-09-30
    • 2016-04-13
    相关资源
    最近更新 更多