• 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

  • 相关阅读:
    链表数据-PHP的实现
    关于go的init函数
    socket小计
    很随笔
    go获取当前项目下所有依赖包
    关于synergy的问题
    二叉树的最大路径和
    大数求和
    重载<<运算符第二个参数必须加上const
    表达式求值
  • 原文地址:https://www.cnblogs.com/jelly12345/p/16602911.html
Copyright © 2020-2023  润新知