我正在研究电影票务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)时怎么可能?
[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();