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
郭慕荣博客园