У меня есть следующий поток в Mule 3.3.2:Вложенные транзакции в Муле: возможны ли они?
<flow name="testFlow" processingStrategy="synchronous">
<vm:inbound-endpoint
connector-ref="vmConnector"
path="in">
<vm:transaction action="ALWAYS_BEGIN"/>
</vm:inbound-endpoint>
<transactional action="ALWAYS_BEGIN">
<jdbc:outbound-endpoint
connector-ref="jdbcConnector"
queryKey="insertTest"
/>
<jdbc:outbound-endpoint
connector-ref="jdbcConnector"
queryKey="insertTest2"
/>
<rollback-exception-strategy/>
</transactional>
<vm:outbound-endpoint
connector-ref="vmConnector"
path="outErrorQueue">
<vm:transaction action="ALWAYS_JOIN"/>
</vm:outbound-endpoint>
</flow>
То, что я пытаюсь достичь является транзакцией JDBC вложенной в сделку Vm: любое исключение внутри транзакционной рамки должно вызвать откат для транзакции JDBC , распространяются на объем транзакционного потока и запускают стратегию исключения по умолчанию для транзакции vm. Разумеется, любое исключение за пределами транзакционной области должно просто запускать стратегию исключения по умолчанию для потока.
Источник считывания, например. org.mule.transaction.TransactionCoordination
заставляет меня думать, что это может сработать, по крайней мере, если transactional
примет ACTION_NOT_SUPPORTED
как действие (которого нет - могу ли я это сделать?).
Что я получаю вместо этого
org.mule.transaction.IllegalTransactionStateException: A transaction is not available for this session, but transaction action is "Always Join"
at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:41)
at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:44)
at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:52)
на ВМ: исходящий конечной точки.
Есть ли альтернативный способ получить то, что я хочу с Мулом?
Да, конечно, XA сделки. Я должен обойтись без них, и хорошо, если бы была только одна конечная точка jdbc, я мог бы покончить с транзакционной областью и дать конечной точке jdbc транзакцию jdbc с действием NOT_SUPPORTED, которое будет делать то, что я хочу, я думаю. В этой ситуации нет никакой проблемы с нажатием транзакции vm на изолированном стеке tx и последующим ее извлечением. Это не требует сотрудничества на части транзакции vm. Конечно, я могу не понимать механизм. – Jule
@David, есть ли форма для использования + больше одного ресурса, p.ex. DB1.MySQL + DB2.Oracle, как этот ответ, внутри блока 'transaction' на Mule CE 3.7? – Muka
@Muka Я думаю, вам понадобится EE, чтобы получить блок «ee: xa-transactional» в 3.7. Не 100% уверен, хотя, вы должны попробовать. –