例如,我们有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方法。 在日志中,我们可以看到方法testA创建了一个新事务,什么是OK。 但是当从methodA执行testB方法时, 在日志中,我们有正在使用实际交易的信息 而不是暂停实际和创建另一个 (就像在配置中定义的那样)。
春天的正常行为也是如此 当我们在同一服务的其他方法中执行服务方法时, spring省略此方法的事务配置 (例如方法testB的示例) 并始终使用PROPAGATION_REQUIRED属性?
另外,假设方法testB来自其他服务 和此方法的配置相同(PROPAGATION_REQUIRES_NEW) 一切似乎都很好(新的转换被创建,实际暂停)。
由于事务管理器使用WebSphereTransactionManagerFactoryBean(spring 2.5)。
感谢
答案 0 :(得分:1)
是的,这是正常行为。
请参阅7.6.1 Understanding AOP proxies以获取解释和一些解决方法。另请参阅Spring - @Transactional - What happens in background?。