트랜잭션 전파와 범위¶
Fox Transactions 가 제공하는 트랜잭션은 여러 트랜잭션 메서드들이 참여하여 하나의 트랜잭션을 구성하며 참여한(enlisted) 트랜잭션 메서드들이 모두 성공(complete) 해야만 커밋을 수행합니다. 트랜잭션 메서드들이 어떻게 하나의 트랜잭션을 구성하는가를 잘 이해해야만 개별 트랜잭션 메서드의 투표가 트랜잭션 결과에 어떤 영향을 주는지 이해가 가능합니다. 이 문서는 Fox Transactions 환경에서 트랜잭션 메서드들의 호출 관계에 따라 트랜잭션의 범위가 어떻게 구성되는지를 설명합니다.
이 문서와 관련된 예제 코드는 다음을 참조 하십시요.
비 트랜잭션 코드¶
비 트랜잭션 코드란 Fox Transactions 를 사용하지 않는 코드를 말합니다. Fox Transactions 를 전혀 사용하지 않는 코드의 예로는 Program.cs 의 Main 메서드나 ASP.NET 서버측 코드들이 대표적입니다. 이들 코드들이 Fox Transactions 를 활용하여 트랜잭션을 처리하려면 반드시 수행 프록시를 생성하여 트랜잭션 코드를 호출해야 합니다.
트랜잭션 시작과 종료¶
Fox Transactions 에서 다음과 같은 상황에서 새로운 트랜잭션이 시작하며 트랜잭션을 시작하는 메서드를 트랜잭션 루트(transaction root)라고 부릅니다.
-
트랜잭션이 시작하지 않은 상태에서 트랜잭션 옵션이
Required인 메서드가 호출된 경우 -
기존 트랜잭션 여부와 무관하게 트랜잭션 옵션이
RequiresNew인 메서드가 호출된 경우
트랜잭션 루트는 트랜잭션의 시작점이자 트랜잭션이 종료하는 시점입니다. 즉, 트랜잭션 루트 메서드가 종료하는 시점에서 트랜잭션 역시 종료되며 이때 트랜잭션이 커밋되거나 롤백 됩니다. 다음 그림은 다양한 상황에서 트랜잭션 루트 메서드를 보여 줍니다.
위 그림에서 주의해서 보아야 할 부분은 다음과 같습니다.
-
Suppressed옵션이 명시된 메서드는 항상 트랜잭션 바깥에서 수행됩니다. (트랜잭션 A 상황) -
Required옵션이 명시된 메서드가 항상 트랜잭션 루트가 되는 것은 아닙니다. (트랜잭션 B 상황) -
트랜잭션이 이미 시작되었더라도
RequiresNew옵션이 명시된 메서드는 항상 새로운 트랜잭션을 시작하고 트랜잭션 루트가 됩니다. (트랜잭션 D 상황) -
Supported옵션이 명시된 메서드는 트랜잭션이 이미 시작된 상황에서 호출되어야만 트랜잭션에 참여(enlist) 합니다.
트랜잭션 전파¶
트랜잭션 루트에서 시작한 트랜잭션은 다른 트랜잭션 메서드를 호출함에 따라 그 메서드가 트랜잭션에 참여하게 만들어 트랜잭션을 전파할 수 있습니다. 위 그림의 트랜잭션 A 상황에서 Required 옵션을 가진 트랜잭션 메서드가 Supported 옵션을 가진 트랜잭션 메서드를 하여 트랜잭션에 참여하게 되는 것입니다.
트랜잭션이 전파됨에 따라 하나의 트랜잭션에 참여하는 트랜잭션 메서드는 여러 개로 늘어날 수 있으며 각 트랜잭션 메서드들은 트랜잭션 결과에 영향을 미치게 됩니다. 위 그림에서 트랜잭션 B 상황은 3 개의 트랜잭션 메서드가 참여하며 각 트랜잭션 메서드는 트랜잭션 결과에 투표를 수행하며 모든 메서드가 성공에 투표해야만 트랜잭션 루트 메서드가 종료될 때 커밋이 수행됩니다.
단순히 어떤 메서드를 호출한다고 해서 그 메서드가 트랜잭션 결과에 영향을 미치는 것은 아닙니다. 임의의 메서드가 아닌 FoxComponentBase 에서 파생된 클래스의 메서드이어야 하며 수행 프록시를 통한 트랜잭션 메서드 호출이어야 합니다. 예를 들어 다음 코드에서 Method2 에 대한 호출이나 Method3 에 대한 호출은 어떠한 전처리/후처리도 발생하지 않기 때문에 트랜잭션 전파가 아니며 Fox Transactions 관점에서는 Method1 메서드만이 트랜잭션에 참여한 것으로 간주됩니다.
Warning
Method1 에서 Method3 를 호출하는 코드에 주목하십시요. Method3 를 호출할 때 수행 프록시가 사용되지 않았기 때문에 Fox Transactions 의 어떤 기능도 작동하지 않습니다. 따라서 RequiresNew 옵션이 사용되었더라도 새로운 트랜잭션이 시작되지 않습니다.
Summary¶
Fox Transactions 에서 트랜잭션은 여러 트랜잭션 메서들의 참여(enlist)로 구성됩니다. 트랜잭션 메서드의 트랜잭션 참여는 수행 프록시를 통해 전처리/후처리가 포함되는 호출을 통해서 트랜잭션이 전파되어야 합니다. 단순한 메서드 호출이나 프록시를 사용하지 않는 호출은 트랜잭션이 전파되지 않습니다.
트랜잭션은 트랜잭션 루트 메서드 시작과 함께 시작되며 트랜잭션 루트 메서드의 종료와 함께 종료되어 커밋 혹은 롤백 됩니다. 트랜잭션은 참여한 모든 트랜잭션 메서드들이 트랜잭션 성공에 투표해야만 커밋됩니다.
