<transacted /> 在 apache camel 中不工作
<transacted /> is not working in apache camel
我有一个包含两个 table 的数据库,accountsA 和 accountsB。我想在同一事务范围内对这两个数据库 table 进行一些更新,所以我使用了组件,但是当更新 accountsB 时发生异常时,正在继续更新 accountsA,我需要我的数据库两者一起更新或 none 个更新。
为了测试交易组件是否正常工作,我更改了 accountB table 名称的名称,出现异常。我原以为 accountA table 的更新会停止,但它并没有发生。我做错什么了吗?
<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>
也许您只是省略了它,但您的问题中缺少的一个关键要素是 DataSourceTransactionManager
,它使您的 DataSource
具有事务性。
<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
我有一个包含两个 table 的数据库,accountsA 和 accountsB。我想在同一事务范围内对这两个数据库 table 进行一些更新,所以我使用了组件,但是当更新 accountsB 时发生异常时,正在继续更新 accountsA,我需要我的数据库两者一起更新或 none 个更新。
为了测试交易组件是否正常工作,我更改了 accountB table 名称的名称,出现异常。我原以为 accountA table 的更新会停止,但它并没有发生。我做错什么了吗?
<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>
也许您只是省略了它,但您的问题中缺少的一个关键要素是 DataSourceTransactionManager
,它使您的 DataSource
具有事务性。
<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>