#apache-camel #transactionscope #transactional
#apache-camel #transactionscope #транзакционный
Вопрос:
У меня есть база данных с двумя таблицами, accountsA и accountsB. Я хочу выполнить некоторые обновления для обеих этих таблиц базы данных в одной области транзакции, поэтому я использовал component, но когда при обновлении accountsB возникает исключение, обновления accountsA продолжаются, мне нужно, чтобы моя база данных выполняла оба обновления вместе или ни одно из них.
для проверки корректности работы транзакционного компонента я внес изменения в название таблицы 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:
Возможно, вы просто опустили это, но в вашем вопросе отсутствует ключевой элемент, DataSourceTransactionManager
который делает вашу DataSource
транзакцию.
<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
Комментарии:
1. спасибо за ваш ответ, вы правы, я добавляю его в свой проект, но это пока не решает проблему : (
2. Есть ли что-нибудь еще, что я забыл добавить?
3. Почему у вас есть
relaxAutoCommit=true
URL-адрес вашей базы данных? Разве это не позволяет игнорировать команды транзакции, такие какcommit()
илиrollback()
хотяautoCommit
включено?4. Я тестирую его без автоматической фиксации, но ничего не изменилось.
5. Тогда вам, вероятно, придется выполнить отладку в нем, чтобы найти проблему. Либо мы не находим недостающую часть, и поэтому у вас вообще нет транзакции, либо ваш маршрут работает идеально, но ваша база данных не может выполнять транзакции или откаты