编辑:这只发生在 MSSQL 和 jtds 1.2.6 仍在调查中...
**重复的:Mule 3.3.0 Jdbc 事务不需要的提交
**Mule 文档很烂。
我想回滚具有多个数据库端点的流中的所有内容。
我有一个单一的 JDBC 数据源资源(即不需要花哨的 XA、2PC 等)。
我已经设法将 Mule 配置为,至少不会抱怨没有配置事务管理器等......但是:它不起作用;即发生异常时它不会回滚事务。
由于我是独立运行 Mule,我没有花哨的 weblogic、jboss 等事务管理器,所以我想我可以使用 Spring 的 DataSourceTransactionManager。对此我还有什么选择?
这是我的流程(flow1 仅用于触发 flow2,这是我想要交易的流程):
和 XML:
<?xml version="1.0" encoding="UTF-8"?>
<mule version="CE-3.3.0">
<spring:beans>
<spring:bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<spring:property name="dataSource" ref="dataSource" />
</spring:bean>
<spring:bean id="transactionFactory"
class="org.mule.module.spring.transaction.SpringTransactionFactory">
<spring:property name="manager" ref="transactionManager" />
</spring:bean>
<spring:bean id="dataSource" name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<spring:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<spring:property name="url" value="jdbc:mysql://localhost/mydb"/>
<spring:property name="username" value="sa"/>
<spring:property name="password" value=""/>
</spring:bean>
</spring:beans>
<jdbc:connector name="jdbcConnector" dataSource-ref="dataSource"
transactionPerMessage="true" queryTimeout="20000" pollingFrequency="10000"
doc:name="Database" validateConnections="false"></jdbc:connector>
<flow name="flow1" doc:name="flow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="toFlow2" doc:name="VM"/>
</flow>
<flow name="flow2" doc:name="flow2">
<vm:inbound-endpoint exchange-pattern="request-response" path="toFlow2" doc:name="VM">
<custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10"/>
</vm:inbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="query1" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Database">
<jdbc:query key="query1" value="insert into Foo (field1) values ('bar')"/>
<jdbc:transaction action="ALWAYS_JOIN"/>
</jdbc:outbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="query2" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Database">
<jdbc:query key="query2" value="insert into Bar (field1) values ('foo')"/>
<jdbc:transaction action="ALWAYS_JOIN"/>
</jdbc:outbound-endpoint>
</flow>
</mule>
这里没有显示,我还有一个默认的异常捕获策略,它只是将错误的有效负载写入文件。我不知道我是否需要明确地回滚,但我没有找到方法。
任何帮助将非常感激。