为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2019-07-05 14:45:38
Spring@Transaction方法调用同一类中的方法,不工作吗?我是Spring事务的新手。有些事我觉得很奇怪,也许我确实理解得很清楚。我希望在方法级别上有一个事务处理,并且在同一个类中有一个调用者方法,看起来它不是这样的,它必须从单独的类中调用。我不明白这怎么可能。如果有人知道如何解决这个问题,我将非常感激。我想使用同一个类来调用带注释的事务性方法。以下是代码: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);         }     } }
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

这里的问题是,Spring的AOP代理没有扩展,而是包装您的服务实例来拦截调用。这样做的效果是,服务实例中对“this”的任何调用都将直接在该实例上调用,并且不能被包装代理截获(代理甚至不知道任何此类调用)。已经提到了一个解决办法。另一个很好的方法是让Spring将服务的一个实例注入到服务本身,并在注入的实例上调用您的方法,该实例将是处理您的事务的代理。但是请注意,如果您的服务bean不是单例的话,这可能也会产生不良的副作用:

<bean id="userService" class="your.package.UserService">
  <property name="self" ref="userService" />
    ...</bean>public class UserService {
    private UserService self;

    public void setSelf(UserService self) {
        this.self = self;
    }

    @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) {
            self.addUser(user.getUserName, user.getPassword);
        }
    } }


查看完整回答
反对 回复 2019-07-05
?
慕后森

TA贡献1802条经验 获得超5个赞

有了Spring 4,你就有可能自我反省

@Service@Transactionalpublic class UserServiceImpl implements UserService{
    @Autowired
    private  UserRepositroy repositroy;

    @Autowired
    private UserService userService;

    @Override
    public void update(int id){
       repository.findOne(id).setName("ddd");
    }

    @Override
    public void save(Users user) {
        repositroy.save(user);
        userService.update(1);
    }}


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 2353 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信