Java 回滚正在处理事务,但因SQLNonTransientConnectionException而崩溃
我正在开发一个电影票务java应用程序。 有一个椅子网格,用户选择要预订的所有椅子,然后按ok进行预订(在mysql数据库中插入行)。如果任何假装的预订由于重复条目而失败,则所有预订都将回滚。 要做到这一点,请按“购买”按钮,我会: 这是可行的,因为实际上所有的预订都被取消了。 但无论如何都会抛出:java.sql.SQLNonTransientConnectionException: 当autocommit=true时无法调用回滚 所以程序失败了。Java 回滚正在处理事务,但因SQLNonTransientConnectionException而崩溃,java,mysql,jdbc,Java,Mysql,Jdbc,我正在开发一个电影票务java应用程序。 有一个椅子网格,用户选择要预订的所有椅子,然后按ok进行预订(在mysql数据库中插入行)。如果任何假装的预订由于重复条目而失败,则所有预订都将回滚。 要做到这一点,请按“购买”按钮,我会: 这是可行的,因为实际上所有的预订都被取消了。 但无论如何都会抛出:java.sql.SQLNonTransientConnectionException: 当autocommit=true时无法调用回滚 所以程序失败了。 如何可能回滚正在工作,同时抛出“无法回滚”消
如何可能回滚正在工作,同时抛出“无法回滚”消息?当我在每个循环中执行setAutoCommit(false)时,这怎么可能呢?
DbConnect.getConnection()
每次调用时都会得到一个新的连接
自动提交是基于每个连接设置的。因此,您正在回滚到另一个连接。controllerBooking还需要一个连接引用来使用相同的连接
因此:
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;
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();