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

235 阅读1分钟

一、注入自己

二、如下(适用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.它是明确的,因此更具可读性。

stackoverflow.com/questions/3…