编辑:这只发生在MSSQL&jtds 1.2.6仍在调查的情况下...
**:Mule 3.3.0 Jdbc事务不希望提交的副本
**Mule文档烂透了。
我想回滚包含多个数据库endpoint的流中的所有内容。
我只有一个JDBC数据源资源(即不需要花哨的XA、2PC等)。
我已设法配置Mule,至少不抱怨没有配置事务管理器等...但是:它不起作用;
因为我是独立运行Mule,所以我没有很好的weblogic、jboss等TransactionManager,所以我想我可以使用Spring的DataSourceTransactionManager。对此我还有什么别的选择?
下面是我的flow(flow1只是用来触发flow2,我希望它是事务性的):
<?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>
任何帮助都将不胜感激。
在用头撞骡子两天之后,我终于成功了。
结论:
最终工作流程:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:jdbc="http://www.mulesoft.org/schema/mule/jdbc" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans"
version="CE-3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/jdbc http://www.mulesoft.org/schema/mule/jdbc/current/mule-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd ">
<spring:beans>
<spring:bean id="jtdsDataSource" name="jtdsDataSource" class="net.sourceforge.jtds.jdbcx.JtdsDataSource">
<spring:property name="user" value="your_user" />
<spring:property name="password" value="your_password" />
<spring:property name="databaseName" value="your_database" />
<spring:property name="serverName" value="your_host" />
</spring:bean>
<spring:bean id="transactionFactory" name="transactionFactory" class="org.mule.transport.jdbc.JdbcTransactionFactory" />
</spring:beans>
<jdbc:connector name="dbConnector" dataSource-ref="jtdsDataSource" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database" />
<flow name="TriggerTxFlow" doc:name="TriggerTxFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" />
<vm:outbound-endpoint exchange-pattern="request-response" path="toTxFlow" doc:name="VM" />
</flow>
<flow name="TxFlow" doc:name="TxFlow">
<vm:inbound-endpoint exchange-pattern="request-response" path="toTxFlow" doc:name="VM">
<custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
</vm:inbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert" value="insert into test values (1, 'Test 1')" />
</jdbc:outbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="Database">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert2" value="insert into test values (2, 'Test 2')" />
</jdbc:outbound-endpoint>
</flow>
</mule>
以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 - 编译并运行结果如下 -
我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器:
我试图编写一个spring-cloud-stream函数(spring-starter-parent 2.5.3,java 11,spring-cloud-version 2020.0.3),该函数同时具有Kafka和Postgres事务。每当使用的消息以字符串“fail”开始时,该函数将引发一个模拟错误,我希望这将导致数据库事务回滚,然后导致kafka事务回滚。(我知道Kafka交易不是XA,这
我试图在ApacheTome中实现分布式事务。换句话说,流程是: 消息读取器(即消息驱动bean)从队列(1)中读取并处理一条消息触发: 行动1,2, 托米。xml Springconfig。xml: SpringConfig。xml MyMessageReceiver。爪哇: 我的听众。爪哇: 在更新数据库并将消息发送到传出队列之后,我故意抛出,只是为了测试数据库和message broker的
我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了
这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?