回滚正在处理事务,但由于SQLNonTransientConnectionException反而崩溃

问题描述 投票:-1回答:1

我正在研究电影票务Java应用程序。有一个椅子网格,用户选择所有椅子进行预订,然后按OK进行预订(在mysql数据库中插入行)。如果由于重复输入而假装的任何预订均失败,则将全部回滚。要做到这一点,我听按钮“购买”:

    case "buy":         
        try {
        boolean success = true;         
            for(Booking b : bookingsToDo) {
                 if(DbConnect.getConnection().getAutoCommit())
                     DbConnect.getConnection().setAutoCommit(false);

                        success = controllerBooking.insertBooking(b);

                if(!success) {
                    JOptionPane.showMessageDialog(frameMain, "Error occurred, booking failed");

                    DbConnect.getConnection().rollback();                                               
                } 
            }

            if(success) {
                JOptionPane.showMessageDialog(frameMain, "Booking done");

                DbConnect.getConnection().commit();

            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        break;

这是有效的,因为实际上所有预订都被撤消。但是无论如何都抛出:java.sql.SQLNonTransientConnectionException:

autocommit = true时无法调用回滚

所以程序失败了。回滚可能如何工作,同时抛出“无法回滚”消息?当我在每个循环中执行setAutoCommit(false)时怎么可能?

java mysql jdbc
1个回答
0
投票

[DbConnect.getConnection()每次被调用都会得到一个新的连接。

自动提交是基于每个连接设置的。因此,您正在回滚到其他连接。 controllerBooking还需要一个连接引用以使用相同的连接。

所以:

        con = DbConnect.getConnection(); 
        con.setAutoCommit(false);

        for(Booking b : bookingsToDo) {
            success = controllerBooking.insertBooking(con, b);

            if(!success) {
                JOptionPane.showMessageDialog(frameMain, "Error occurred, booking failed");

                con.rollback();                                               
                break;
            } 
        }
        con.commit();
© www.soinside.com 2019 - 2024. All rights reserved.