Например, у нас есть служба 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).
спасибо