2017-04-24 83 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>