【问题标题】:Mule 3.3.0 Jdbc Transaction Undesired CommitMule 3.3.0 Jdbc 事务意外提交
【发布时间】:2013-01-22 16:21:04
【问题描述】:

我正在尝试设置一个 jdbc 事务的虚拟示例来测试提交和回滚。我得到了:

  • 启动流程的 http 入口点,
  • 在 db 上插入一个引发异常的组件
  • 关于 db 的更新。

我希望在组件异常插入后回滚,但事实并非如此。 调试骡源我已经看到,在类 BeginAndResolveTransactionInterceptor 中,插入语句以提交终止,因为 resolveStartedTransaction 属性设置为 true。 这就是为什么我认为默认异常策略回滚不起作用的原因...... 我不知道我是否在配置中做错了什么,或者是否是错误的行为。

<spring:beans>
        <spring:bean id="sqlServerDataSource" name="sqlServerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <spring:property name="password" value="${db.connection.password}"/>
            <spring:property name="url" value="${db.connection.url}"/>
            <spring:property name="username" value="${db.connection.username}"/>
            <spring:property name="driverClassName" value="${db.connection.driver_class}"/>
        </spring:bean>
        <spring:bean id="sqlServerSqlStatementStrategyFactory" name="sqlServerSqlStatementStrategyFactory" class="it.clesius.ebs.common.db.SqlServerSqlStatementStrategyFactory"/>
        <spring:bean id="DBRecord1" class="org.apache.commons.dbutils.handlers.BeanListHandler">
            <spring:constructor-arg value="it.clesius.esb.db.beans.DBRecord1"/>
        </spring:bean>
    </spring:beans>
<jdbc:connector name="JDBC_Connector" dataSource-ref="sqlServerDataSource" resultSetHandler-ref="DBRecord1" validateConnections="true" transactionPerMessage="false" queryTimeout="-1" pollingFrequency="0" doc:name="JDBC_Connector">
        <!-- jdbc:sqlStatementStrategyFactory ref="sqlServerSqlStatementStrategyFactory"/>
        <spring:property name="retryPolicyTemplate">
            <spring:bean class="org.mule.retry.policies.SimpleRetryPolicyTemplate">
                <spring:property name="count" value="10"/>
                <spring:property name="frequency" value="60000"/>
            </spring:bean>
        </spring:property -->

    </jdbc:connector>
    <flow name="DBTestFlow" doc:name="DBTestFlow">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8083" path="db" doc:name="HTTP"/>
        <message-properties-transformer doc:name="Add db properties">
            <add-message-property key="db.connection.driver_class" value="${db.connection.driver_class}"/>
            <add-message-property key="db.connection.password" value="${db.connection.password}"/>
            <add-message-property key="db.connection.url" value="${db.connection.url}"/>
            <add-message-property key="db.connection.username" value="${db.connection.username}"/>
        </message-properties-transformer>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="InsertTest" responseTimeout="10000" mimeType="text/plain" queryTimeout="-1" connector-ref="JDBC_Connector" doc:name="Database (JDBC)">
            <jdbc:transaction action="ALWAYS_BEGIN" />
            <!-- property key="receiveMessageInTransaction" value="true" /-->
            <jdbc:query key="InsertTest" value="INSERT INTO [ClesiusICEF_DEV].[dbo].[AAATEST_CANCELLLAMIPUREQUANDOVUOI] ([F1],[F2],[F3]) VALUES ('1','2','3')"/>
        </jdbc:outbound-endpoint>
        <component class="it.clesius.esb.ExceptionTest" doc:name="Break Flow with an Exception to Test Transaction Rollback"/>
        <jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="UpdateTest" responseTimeout="10000" mimeType="text/plain" queryTimeout="-1" connector-ref="JDBC_Connector" doc:name="Database (JDBC)">
            <jdbc:transaction action="ALWAYS_JOIN" />
            <jdbc:query key="UpdateTest" value="UPDATE [ClesiusICEF_DEV].[dbo].[AAATEST_CANCELLLAMIPUREQUANDOVUOI] SET [F1]='Aggiornato'"/>
        </jdbc:outbound-endpoint>
        <default-exception-strategy>
            <rollback-transaction exception-pattern="*"/>
            <logger level="INFO" message="!!!!!!!!!!TRANSAZIONE ANNULLATA!!!!!!!!!!!!!!!!!!!!!!!!!!!111" doc:name="Logger"/>
        </default-exception-strategy>
    </flow>

【问题讨论】:

  • 乍一看,你并没有做错什么。在 Mule 3.3.0 中,引入了 rollback-exception-strategy:您应该尝试一下。请参阅:mulesoft.org/documentation/display/MULE3USER/…,是的,我知道 MuleSoft 不再将 XML 放入他们的文档中,而只是将 Studio 屏幕截图 :( 但 XML 编辑器应该指导您构建配置。
  • 您正在测试什么 db & jdbc 驱动程序?我在使用 jtds 驱动程序的 mssql 服务器上遇到了类似的问题。我在 h2 上工作得很好。我打开了类似的问题:stackoverflow.com/questions/13650959/… 我的 xml 是不同的(文档很烂,所以谁知道哪个是正确的):如果我在 jdbc 端点开始事务,它不起作用,我用(未记录的) 之后的 custom-transaction />

标签: jdbc transactions esb mule rollback


【解决方案1】:

好的,我找到了解决方法。如果事务是由 vm 而不是 jdbc 启动的,它可以正常工作。 可能在 jdbc/transaction 中存在一个错误,它总是在第一次事务性时提交 端点是 jdbc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 2015-07-25
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多