私はJava JDBCを初めて使用しており、小さなデータベースアプリケーションを開発しました。私は
から学んでいます。O'Reilly - JDBCとJavaでのデータベースプログラミング第2版。JDBC: `con.rollback()`は`con.commit`が成功しなかった場合にのみ有効ですか?
が成功しなかった場合にのみ、con.rollback()
は効果がありますか?
実際にcon.rollback()
を呼び出すと、con.commit()
が成功してもその効果があると思います。これは、 '元に戻す'として利用することを意味します。
con.commit()
の後にcon.rollback()
を呼び出してみましたが、私が推測したとおりに動作しません。だからそれは大丈夫/期待されていますか?
この例では、私は上記の本からです:
con.rollback()
がコメントアウトされています。 con.close()
の前に終わりに近づいています。コメントを外してみてください。 con.rollback()
は、con.commit()
が成功した後に物をロールバックしません。
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UpdateLogic
{
public static void main(String args[])
{
Connection con = null;
try
{
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver).newInstance();
String url = "jdbc:mysql://localhost:3306/Company";
Statement s;
con = DriverManager.getConnection(url, "root", "");
con.setAutoCommit(false); // make sure auto commit is off!
s = con.createStatement();// create the first statement
s.executeUpdate("INSERT INTO employee VALUES ('1', 'employee 1', '22','00-1234')");
s.close(); // close the first statement
s = con.createStatement(); // create the second statement
s.executeUpdate("INSERT INTO employee VALUES ('2', 'employee 2', '21','00_4321')");
con.commit(); // commit the two statements
System.out.println("Insert succeeded.");
s.close(); // close the second statement
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex)
{
Logger.getLogger(UpdateLogic.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException e)
{
if (con != null)
{
try
{
con.rollback();
} // rollback on error
catch (SQLException i)
{
}
}
e.printStackTrace();
} finally
{
if (con != null)
{
try
{
//con.rollback();
con.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
あなたが求めているものを作るのは難しいです。コミットが成功してから完了したら、その時点でロールバックすることはできません。あなたは 'commit'メソッドを呼び出す前にロールバック***のトランザクションをマークする必要があります。 – Perception