<transacted /> не работает в Apache Camel - PullRequest
1 голос
/ 09 апреля 2019

У меня есть база данных с двумя таблицами: accountA и accountB. Я хочу сделать некоторые обновления для обеих этих таблиц базы данных в одной и той же области транзакции, поэтому я использовал компонент, но когда происходит исключение при обновлении учетных записей B, обновления учетных записей A продолжаются, мне нужно, чтобы моя база данных выполняла оба обновления вместе или ни один из них.

для проверки правильности работы транзакционного компонента я внес изменение в имя таблицы accountB, исключение начислено. Я ожидал, что обновление таблицы accountA будет остановлено, но этого не произошло. я сделал что-то неправильно?

    <bean id="mysql-ds-local" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/BankDB?relaxAutoCommit=true"/>
  <property name="username" value="root"/>
  <property name="password" value="osslab"/>
  <property name="poolPreparedStatements" value="true"/>
    </bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="mysql-ds-local"/>
</bean>


<camelContext id="camel-jdbc-test" xmlns="http://camel.apache.org/schema/blueprint" >

   <route id="main-route-jdbc">


      <from uri="timer://webinar?period=20000" /> 
       <transacted />
          <to uri="direct:reduceCredit"/>
          <to uri="direct:increaseCredit"/>
    </route>
    <route id="reduceCredit-route">
        <from uri="direct:reduceCredit"/>
        <log message="in direct accountA"/>
        <setBody>
            <constant>update accountsA set credit = credit + 1 where id = 1</constant>
        </setBody>
        <to uri="jdbc:mysql-ds-local" />
    </route>
   <route id="increaseCredit-route">
        <from uri="direct:increaseCredit"/>
        <log message="in direct accountB"/>
        <setBody>
            <constant>update accountsB set credit = credit + 1 where id = 1</constant>
        </setBody>
        <to uri="jdbc:mysql-ds-local" />
    </route>

</camelContext>

1 Ответ

0 голосов
/ 09 апреля 2019

Возможно, вы просто пропустили это, но ключевым элементом, который отсутствует в вашем вопросе, является DataSourceTransactionManager, который делает ваш DataSource транзакционным.

<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="myDataSource"/>
</bean>
...