您好,我怎样才能通过一笔交易来操作其他 dao?

Posted

技术标签:

【中文标题】您好,我怎样才能通过一笔交易来操作其他 dao?【英文标题】:Hi, How can i do operation of others dao with one transaction? 【发布时间】:2021-08-08 22:52:53 【问题描述】:

我知道在一个事务中应该使用哪些方法 正确执行此操作的最佳方法是什么? 车刀有以下方法

public Car findCar(int numOfPas,String carCategory)
        String query = "SELECT*FROM car_info WHERE numOfPas = ? AND carCategory=? AND carState='ready' ORDER BY RAND() LIMIT 1;";
        Car foundCar = null;
        ResultSet resultSet = null;
        try (Connection connection = mysqlDAOFactory.getConnection();
             PreparedStatement statement = connection.prepareStatement(query))
            statement.setInt(1,numOfPas);
            statement.setString(2,carCategory);
            resultSet =statement.executeQuery();
            if(resultSet.next())
                foundCar = new Car();
                foundCar.setCarId(resultSet.getInt("carId"));
                foundCar.setCarCategory(resultSet.getString("carCategory"));
                foundCar.setNumOfPas(resultSet.getInt("numOfPas"));
                foundCar.setCarState(resultSet.getString("carState"));
                foundCar.setCarName(resultSet.getString("carName"));
                foundCar.setCarImage(manager.byteToImage(resultSet.getBytes("carImage")));
            
         catch (SQLException throwables) 
            throwables.printStackTrace();
        finally 
            if(resultSet!=null)
                try 
                    resultSet.close();
                 catch (SQLException throwables) 
                    throwables.printStackTrace();
                
            
        
        return foundCar;

    

Order Dao 有追随者

@Override
    public boolean insertOrder(Order order) 
        int rowNum = 0;
        String query = "INSERT INTO user_order(userId,carId,userAddress,userDestination,orderCost,orderDate) values(?,?,?,?,?,?)";
        ResultSet keys = null;
        try (Connection connection = MySQLDAOFactory.getConnection();
             PreparedStatement statement = connection.prepareStatement(query,Statement.RETURN_GENERATED_KEYS))

            statement.setInt(1,order.getUserId());
            statement.setInt(2,order.getCarId());
            statement.setString(3, order.getUserAddress());
            statement.setString(4, order.getUserDestination());
            statement.setDouble(5,order.getOrderCost());
            statement.setTimestamp(6, Timestamp.valueOf(order.getOrderDate()));
            rowNum = statement.executeUpdate();
            keys = statement.getGeneratedKeys();
            if(keys.next())
                order.setOrderId(keys.getInt(1));
            

         catch (SQLException throwables) 

            throwables.printStackTrace();
        

        return rowNum>0;
    

如何将这些操作放在一个事务中?我通过 Apache dhcp 连接池接收连接。

编辑

这是课 我在哪里得到连接 公共类 MySQLDAOFactory 扩展 DAOFactory

    public static Connection getConnection()

        Connection conn = null;
        try 
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:comp/env");
            DataSource ds = (DataSource) envContext.lookup("jdbc/UsersDB");
            conn = ds.getConnection();
         catch (NamingException | SQLException e) 
            e.printStackTrace();
        

        return conn;
    
    @Override
    public CarDao getCarDao() 
        return new MySQLCarDao();
    

    @Override
    public UserDao getUserDao() 
        return new MySQLUserDao();
    
    @Override
    public OrderDao getOrderDao() 
        return new MySQLOrderDao();
    

    @Override
    public CarCategoryDao getCarCategoryDao() 
        return new MySQLCarCategoryDao();
    

【问题讨论】:

【参考方案1】:

有很多不同的方式来管理交易。鉴于您的代码,最简单的方法是:

try 块中:

    在封装两个调用的调用者中创建您的 connection 执行connection.setAutoCommit(false) 调用findCar()insertOrder()的每个方法 致电connection.commit();

catch 块中:

致电connection.rollback()

connection 不是在这些函数之外创建的,所以不要忘记从每个函数中删除连接设置。

【讨论】:

以上是关于您好,我怎样才能通过一笔交易来操作其他 dao?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用内购买在一笔交易中添加少量下载

如何从多个授权交易中仅捕获一笔交易?

区块链

两台笔记本电脑中的虚拟机怎样才能ping通

怎么样才能更好的理解java servlet 的DAO?

06 | 分布式事务:All or nothing