Spring 解决同一个类中调用方法事务注解失效的问题

代码如下所示,适用于Java8以上版本


@Service
public class UserService {

    @Autowired
    private TransactionHandler transactionHandler;

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

    private boolean addUser(String username, String password) {
        // TODO call userRepository
    }
}
@Service
public class TransactionHandler {

    @Transactional(propagation = Propagation.REQUIRED)
    public <T> T runInTransaction(Supplier<T> supplier) {
        return supplier.get();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public <T> T runInNewTransaction(Supplier<T> supplier) {
        return supplier.get();
    }
}

这种方法有以下优点:
1.它可以应用于私有方法。因此,不必为了满足 Spring 的限制而通过公开方法来破坏封装。
2.可以在不同的事务传播中调用相同的方法,由调用者选择合适的方法。比如:

transactionHandler.runInTransaction(() -> userService.addUser(user.getUserName, user.getPassword));

transactionHandler.runInNewTransaction(() -> userService.addUser(user.getUserName, user.getPassword));

3.它是明确的,因此更具可读性。
参考博客:
https://www.jianshu.com/p/aa8dfdb33488
https://blog.csdn.net/shichen2010/article/details/121792816

 

posted @ 2022-08-19 17:57  郭慕荣  阅读(825)  评论(0编辑  收藏  举报