2017-04-24 40 views
1

将spring与jooq集成时,事务性声明回滚函数不起作用。我的应用程序的context.xml设置低于交易不起作用的spring-jooq

<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,但交易没有回滚。是否有任何其他属性,我必须在应用程序环境xml中设置使其工作。

+0

为了记录在案,这个问题也被要求在[jOOQ手册(HTTPS://www.jooq。 org/doc/latest/manual/sql-execution/transaction-management /#comment-3271116066) –

+0

我想为了让别人能够回答这个问题(无论堆栈溢出还是jOOQ手册),您都需要为'insert2()','VLDataSource'添加代码。我仍然认为你的问题存在于'VLDataSource'内部,但是很难告诉你迄今为止给出的信息。 –

+0

似乎它缺少一些配置。使用(dataSource,dialect)代替DSL。我必须在application-context.xml中使用DSL.using(connProvider,dialect)和下面的属性。 **'<豆ID = “transactionAwareDataSource” 类= “org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy”> <构造精氨酸值= “#{jooqtest.getDataSource()}”/> ** –

回答

1

看起来像application-context.xml中缺少一些属性。为了使jooq意识到spring事务与jooq是同一事务的一部分,我们必须创建一个连接提供者bean,它通过TransactionAwareDataSourceProxy引用dataSource。更新后的代码和配置都低于

@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();} 

平台的应用程序的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> 
<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>