プラシッドMasvidal:
私は、映画発券Javaアプリケーションに取り組んでいます。椅子のグリッドがあり、ユーザが選択ブックへのすべての椅子は、その後、(mysqlデータベース内の行を挿入し)、それを予約する場合は[OK]を押します。予約のいずれかを行うためにふりエントリを複製するため、失敗した場合、それらのすべてがロールバックされます。ボタン「買い」私はリスニング、それを行うには:
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を:
とき自動コミット=真のロールバックを呼び出すことはできません
そのプログラムは、失敗します。それはどのようにロールバックがある可能性がある作業とメッセージを「ロールバックすることはできません」投げ同時に?私はすべてのループににsetAutoCommit(false)をやっているとき、どのようにだろうか?
danblack:
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();