【发布时间】:2018-01-15 16:05:37
【问题描述】:
我在 mule 流中遇到数据库事务问题。这是我定义的流程:
<flow name="createPortinCaseServiceFlow">
<vm:inbound-endpoint path="createPortinCase" exchange-pattern="request-response">
<custom-transaction action="ALWAYS_BEGIN" factory-ref="muleTransactionFactory"/>
</vm:inbound-endpoint>
<component>
<spring-object bean="checkIfExists"/>
</component>
<component>
<spring-object bean="createNewOne"/>
</component>
</flow>
我们的想法是,在 checkIfExists 中,我们验证某些数据是否存在(在数据库中),如果存在则抛出异常。如果没有,我们将转到 createNewOne 并创建一个新数据。
问题
如果我们同时运行流程,新对象将在 createNewOne 中创建多次,它们不应该像我们在它之前调用 checkIfExists 那样。这意味着事务没有正常工作。
更多信息:
createNewOne 和 checkIfExists 都有以下注释:
@Transactional(propagation = Propagation.MANDATORY)
muleTransactionFactory 的定义如下所示
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="dataSource" ref="teleportNpDataSource"/>
<property name="entityManagerFactory" ref="npEntityManagerFactory"/>
<property name="nestedTransactionAllowed" value="true"/>
<property name="defaultTimeout" value="${teleport.np.tm.transactionTimeout}"/>
</bean>
<bean id="muleTransactionFactory" class="org.mule.module.spring.transaction.SpringTransactionFactory">
<property name="manager" ref="transactionManager"/>
</bean>
我已经设置了 TRACE 日志级别(正如@Shailendra 建议的那样),并且我发现在所有 spring bean 中都重用了事务:
00:26:32.751 [pool-75-thread-1] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Participating in existing transaction
在日志中事务是同时提交的,这意味着这些事务是正确创建的,但同时执行会导致问题。
【问题讨论】:
-
尝试将 spring 事务置于 TRACE 调试模式,看看两种情况的不同stackoverflow.com/questions/1965454/…
-
我做到了并更新了问题
标签: java spring mule spring-transactions transactional