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>
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.