一尘不染

Spring @Transaction方法由同一类中的方法调用,不起作用吗?

spring

我是Spring Transaction的新手。我发现有些事情很奇怪,也许我确实理解得很清楚。我想在方法级别周围进行事务处理,而我在同一个类中有一个调用者方法,似乎不喜欢它,必须从单独的类中调用它。我不知道怎么可能。如果有人知道如何解决此问题,我将不胜感激。我想使用相同的类来调用带注释的事务方法。

这是代码:

public class UserService {

    @Transactional
    public boolean addUser(String userName, String password) {
        try {
            // call DAO layer and adds to database.
        } catch (Throwable e) {
            TransactionAspectSupport.currentTransactionStatus()
                    .setRollbackOnly();

        }
    }

    public boolean addUsers(List<User> users) {
        for (User user : users) {
            addUser(user.getUserName, user.getPassword);
        }
    } 
}

阅读 792

收藏
2020-04-11

共1个答案

一尘不染

这是Spring AOP(动态对象和cglib)的局限性。

如果你将Spring配置为使用AspectJ处理事务,那么你的代码将起作用。

最简单且可能最好的选择是重构代码。例如,一个处理用户的类和一个处理每个用户的类。然后,Spring AOP的默认事务处理将起作用。

使用AspectJ处理事务的配置技巧

为了使Spring能够将AspectJ用于事务,必须将模式设置为AspectJ:

<tx:annotation-driven mode="aspectj"/>

如果你使用的Spring版本低于3.0,则还必须将其添加到Spring配置中:

<bean class="org.springframework.transaction.aspectj
        .AnnotationTransactionAspect" factory-method="aspectOf">
    <property name="transactionManager" ref="transactionManager" />
</bean>
2020-04-11