9.4. 트랜잭션 전파 정책
트랜잭션 클라이언트가 새 트랜잭션을 생성하는 방식에 영향을 미치려면 JmsTransactionManager
를 사용하고 트랜잭션 정책을 지정할 수 있습니다. 특히 Spring 트랜잭션 정책을 사용하면 트랜잭션에 대한 전파 동작을 지정할 수 있습니다. 예를 들어 트랜잭션 클라이언트가 새 트랜잭션을 만들고 트랜잭션이 현재 스레드와 이미 연결되어 있음을 감지하는 경우 새 트랜잭션을 만들고 새 트랜잭션을 생성해야 합니까? 아니면 기존 트랜잭션이 적용되도록 해야 합니까? 이러한 종류의 동작은 트랜잭션 정책에 전파 동작을 지정하여 규제됩니다.
트랜잭션 정책은 블루프린트 XML에서 빈으로 인스턴스화됩니다. 그런 다음 tradeact ed()
DSL 명령에 인수로ans ID
를 제공하여 트랜잭션 정책을 참조할 수 있습니다. 예를 들어 동작에 따라 트랜잭션을 시작하려면 PROPAGATION_REQUIRES_NEW
에서는 다음 경로를 사용할 수 있습니다.
from("file:src/data?noop=true") .transacted("PROPAGATION_REQUIRES_NEW") .bean("accountService","credit") .bean("accountService","debit") .to("file:target/messages");
여기서 PROPAGATION_REQUIRES_NEW
인수는 PROPAGATION_REQUIRES_NEW
동작으로 구성된 트랜잭션 정책의 빈 ID
를 지정합니다. 9.4.3절. “블루프린트 XML에서 정책 빈 정의”을 참조하십시오.
9.4.1. Spring 트랜잭션 정책 정보
Apache Camel을 사용하면 org.apache.camel.spring.spi.SpringTransactionPolicy
클래스를 사용하여 Spring 트랜잭션 정책을 정의할 수 있습니다. 이 정책은 기본적으로 네이티브 Spring 클래스와 관련된 래퍼입니다. SpringTransactionPolicy
클래스는 다음 두 가지 데이터를 캡슐화합니다.
-
PlatformTransactionManager
유형의 트랜잭션 관리자에 대한 참조 - 전파 동작
예를 들어 다음과 같이 PROPAGATION_MANDATORY
동작을 사용하여 Spring 트랜잭션 정책 metrics을 인스턴스화할 수 있습니다.
<blueprint ...> <bean id="PROPAGATION_MANDATORY "class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" /> </bean> ... </blueprint>
9.4.2. 전파 동작 설명
다음 전파 동작은 Spring에서 지원합니다. 이러한 값은 원래 JavaeEE에서 지원하는 전파 동작에 따라 모델링되었습니다.
- PROPAGATION_MANDATORY
- 현재 트랜잭션을 지원합니다. 현재 트랜잭션이 없는 경우 예외를 throw합니다.
- PROPAGATION_NESTED
현재 트랜잭션이 있는 경우 중첩된 트랜잭션 내에서 실행되며
PROPAGATION_REQUIRED
.참고중첩된 트랜잭션은 모든 트랜잭션 관리자가 지원하지 않습니다.
- PROPAGATION_NEVER
- 현재 트랜잭션을 지원하지 않습니다. 현재 트랜잭션이 있는 경우 예외를 throw합니다.
- PROPAGATION_NOT_SUPPORTED
현재 트랜잭션을 지원하지 않습니다. 항상 비-SQL을 실행합니다.
참고이 정책을 사용하려면 모든 트랜잭션 관리자가 지원하지 않는 기능인 현재 트랜잭션을 일시 중단해야 합니다.
- PROPAGATION_REQUIRED
- (기본값) 현재 트랜잭션을 지원합니다. 존재하지 않는 경우 새 항목을 만듭니다.
- PROPAGATION_REQUIRES_NEW
새 트랜잭션을 생성하여 현재 트랜잭션이 있는 경우 일시 중지합니다.
참고트랜잭션 일시 중단은 모든 트랜잭션 관리자가 지원하지 않습니다.
- PROPAGATION_SUPPORTS
- 현재 트랜잭션을 지원합니다. 존재하지 않는 경우 기본적으로 실행합니다.
9.4.3. 블루프린트 XML에서 정책 빈 정의
다음 예제에서는 지원되는 모든 전파 동작에 대해 트랜잭션 정책 빈을 정의하는 방법을 보여줍니다. 편의를 위해 각 빈 ID는 전파 동작 값의 지정된 값과 일치하지만 실제로는 빈 ID에 원하는 값을 사용할 수 있습니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bean id="PROPAGATION_MANDATORY " class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" /> </bean> <bean id="PROPAGATION_NESTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NESTED" /> </bean> <bean id="PROPAGATION_NEVER" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NEVER" /> </bean> <bean id="PROPAGATION_NOT_SUPPORTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_NOT_SUPPORTED" /> </bean> <!-- This is the default behavior. --> <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> </bean> <bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW" /> </bean> <bean id="PROPAGATION_SUPPORTS" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> <property name="transactionManager" ref="txManager" /> <property name="propagationBehaviorName" value="PROPAGATION_SUPPORTS" /> </bean> </blueprint>
이러한 Quarkus 정의를 자체 블루프린트 XML 구성에 붙여넣려면 트랜잭션 관리자에 대한 참조를 사용자 지정해야 합니다. 즉, txManager
에 대한 참조를 트랜잭션 관리자 metrics의 실제 ID
로 바꿉니다.
9.4.4. Java DSL의 PROPAGATION_NEVER
정책이 포함된 샘플 경로
트랜잭션 정책이 트랜잭션에 영향을 미치는 간단한 방법은 다음 경로에 표시된 것처럼 기존 트랜잭션 중간에 PROPAGATION_NEVER
정책을 삽입하는 것입니다.
from("file:src/data?noop=true") .transacted() .bean("accountService","credit") .transacted("PROPAGATION_NEVER") .bean("accountService","debit");
이러한 방식으로 사용되는 PROPAGATION_NEVER
정책은 모든 트랜잭션을 필연적으로 중단하여 트랜잭션 롤백을 생성합니다. 애플리케이션에 미치는 영향을 쉽게 확인할 수 있습니다.
Transact ed()
에 전달된 문자열 값은 전파 동작 이름이 아니라 빈 ID
입니다. 이 예에서 빈 ID
는 전파 동작 이름과 동일하게 선택되지만 항상 그런 것은 아닙니다. 예를 들어 애플리케이션이 두 개 이상의 트랜잭션 관리자를 사용하는 경우 특정 전파 동작이 있는 정책VLAN을 두 개 이상 사용할 수 있습니다. 이 경우 전파 동작 후 빈의 이름을 지정할 수 없었습니다.
9.4.5. 블루프린트 XML에서 PROPAGATION_NEVER
정책이 포함된 샘플 경로
이전 경로는 블루프린트 XML에서 다음과 같이 정의할 수 있습니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <from uri="file:src/data?noop=true" /> <transacted /> <bean ref="accountService" method="credit" /> <transacted ref="PROPAGATION_NEVER" /> <bean ref="accountService" method="debit" /> </route> </camelContext> </blueprint>