Jdbc Mule事务作用域回滚似乎失败

Jdbc Mule事务作用域回滚似乎失败,jdbc,transactions,mule,transactional,Jdbc,Transactions,Mule,Transactional,编辑:Mule 3.4.1 我们有一个Mule流,它交替地从一个数据库读取插入到另一个数据库,所有这些都包装在事务范围内。在这个特殊的例子中,后面的一个插入失败了,我们希望一切都会回滚 当我们查看日志时,会看到第二次插入的异常(例如,重复主键)(即下面示例中的BulkInsertInstanceToCache)。当我们查看数据库时,会看到第一次插入的数据(下面的示例中为BulkInsertActivityToCache)。我们希望所有的数据都消失了 我们是否为所需的行为错误地配置了此作用域 下面

编辑:Mule 3.4.1

我们有一个Mule流,它交替地从一个数据库读取插入到另一个数据库,所有这些都包装在事务范围内。在这个特殊的例子中,后面的一个插入失败了,我们希望一切都会回滚

当我们查看日志时,会看到第二次插入的异常(例如,重复主键)(即下面示例中的BulkInsertInstanceToCache)。当我们查看数据库时,会看到第一次插入的数据(下面的示例中为BulkInsertActivityToCache)。我们希望所有的数据都消失了

我们是否为所需的行为错误地配置了此作用域

下面是一个代码示例,我将其缩减为两个插入,以显示正在执行的处理类型

<flow name="ProcessBulkUpdateCache" processingStrategy="synchronous" doc:name="ProcessBulkUpdateCache">
    <transactional action="ALWAYS_BEGIN" doc:name="Transactional">
        <jdbc-ee:outbound-endpoint exchange-pattern="request-response" 
                queryKey="GetActivitiesForCache" queryTimeout="-1" connector-ref="SumTotalDatabase">
            <jdbc-ee:transaction action="NONE" />
        </jdbc-ee:outbound-endpoint>

        <jdbc-ee:outbound-endpoint exchange-pattern="request-response" 
                queryKey="BulkInsertActivityToCache" queryTimeout="-1" connector-ref="EAIServiceDatabase">
        </jdbc-ee:outbound-endpoint>

        <jdbc-ee:outbound-endpoint exchange-pattern="request-response" 
                queryKey="GetInstancesForCache" queryTimeout="-1" connector-ref="SumTotalDatabase">
            <jdbc-ee:transaction action="NONE" />
        </jdbc-ee:outbound-endpoint>      

        <jdbc-ee:outbound-endpoint exchange-pattern="request-response" 
                queryKey="BulkInsertInstanceToCache" queryTimeout="-1" connector-ref="EAIServiceDatabase">
        </jdbc-ee:outbound-endpoint>        
    </transactional>

    <catch-exception-strategy doc:name="Unexpected">
        ...etc.
    </catch-exception-strategy>                
</flow>

Edit我尝试在第一个INSERT中添加BEGIN\u或\u JOIN事务元素,在第二个INSERT中添加ALWAYS\u JOIN事务元素,但代码在到达第二个INSERT时抛出一个异常,即没有可加入的事务。

分别使用
ALWAYS\u BEGIN
ALWAYS\u JOIN
去吧


但是,如果是两个不同的数据库,则需要使用XA事务。一个本地事务不能从两个不同的数据库注册资源。

正如我所知,应该始终开始第一个出站操作,然后每次出站操作都应该开始

 <db:mysql-config name="MySQL_Configuration" host="localhost" port="3306" user="root" database="ib_trade" useXaTransactions="true" driverClassName="com.mysql.jdbc.Driver" doc:name="MySQL Configuration"/>
    <flow name="transactonmanagerFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/ram" doc:name="HTTP"/>
        <logger level="INFO" doc:name="Logger" message="%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"/>
        <set-payload value="#['hi']" doc:name="Set Payload"/>
        <vm:outbound-endpoint exchange-pattern="request-response" path="temp" connector-ref="VM" doc:name="VM">
            <xa-transaction action="ALWAYS_JOIN" timeout="10000"/>
        </vm:outbound-endpoint>
        <logger level="INFO" doc:name="Logger" message="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"/>
    </flow>
    <flow name="transactonmanagerFlow1">
        <vm:inbound-endpoint exchange-pattern="request-response" path="temp" connector-ref="VM" doc:name="VM">
            <xa-transaction action="ALWAYS_BEGIN" timeout="100000"/>
        </vm:inbound-endpoint>
        <logger level="INFO" doc:name="Logger" message="**************************************************************************"/>
        <db:insert config-ref="MySQL_Configuration" transactionalAction="ALWAYS_JOIN" doc:name="Database">
            <db:dynamic-query><![CDATA[INSERT INTO `ib_trade`.`swt_symbol`(`idswt_symbol`,`symbol_name`,`symbol_exchange`,`symbol_id`) VALUES ("5","1","1","1");]]></db:dynamic-query>
        </db:insert>
        <logger message="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" level="INFO" doc:name="Logger"/>
        <db:insert config-ref="MySQL_Configuration" transactionalAction="ALWAYS_JOIN" doc:name="Copy_of_Database">
            <db:dynamic-query><![CDATA[INSERT INTO `ib_trade`.`swt_symbol`(`idswt_symbol`,`symbol_name`,`symbol_exchange`,`symbol_id`) VALUES ("5","temp","1","1");]]></db:dynamic-query>
        </db:insert>