Spring управление транзакциями для выполнения сервисных методов из одного сервиса - PullRequest
1 голос
/ 09 февраля 2011

Например, у нас есть служба bean, которая имеет два метода и один из них (testA) выполняет другой (testB).

public class TestServiceImpl implements TestService {
...
public void testA() throws Exception {
    ...     
    try {
        this.testB();
    catch(Exception e)
    {
        ...
    }
    ...
}
public void testB() throws Exception {
    ...
}

}

Метод testB определяется атрибутом транзакции PROPAGATION_REQUIRES_NEW, Метод testA определяется с помощью PROPAGATION_REQUIRED.

<bean id="TestService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="target" ref="TestServiceTarget"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props>             
            <prop key="testB*">PROPAGATION_REQUIRES_NEW, ISOLATION_READ_COMMITTED, -Exception</prop>
            <prop key="*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED, -Exception</prop>
        </props>
    </property>
</bean>

Затем мы выполняем метод testA этого сервиса. В журналах мы видим, что для метода test создается новая транзакция, что в порядке. Но когда метод testB выполняется из метода A, в журналах у нас есть информация, что фактическая транзакция используется вместо приостановки фактического и создания другого (как определено в конфигурации).

Так нормально ли это весной, что когда мы выполняем сервисный метод в другом методе того же сервиса, Spring опускает транзакционную конфигурацию для этого метода (как в примере для метода testB) и всегда использовать атрибут PROPAGATION_REQUIRED?

Дополнительно скажем, когда метод testB из другого сервиса и конфигурация для этого метода одинакова (PROPAGATION_REQUIRES_NEW) все вроде бы нормально (новый переход создан, фактический приостановлен).

В качестве менеджера транзакций используется WebSphereTransactionManagerFactoryBean (весна 2.5).

спасибо

1 Ответ

1 голос
/ 09 февраля 2011

Да, это нормальное поведение.

См. 7.6.1 Общие сведения о прокси-серверах AOP для объяснения и некоторых обходных путей. Также см. Spring - @Transactional - Что происходит в фоновом режиме ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...