来自同一服务的执行服务方法的Spring事务管理

时间:2011-02-09 11:39:32

标签: spring transactions

例如,我们有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)。

感谢

1 个答案:

答案 0 :(得分:1)

是的,这是正常行为。

请参阅7.6.1 Understanding AOP proxies以获取解释和一些解决方法。另请参阅Spring - @Transactional - What happens in background?。