接続を作成するとすぐにcon.setAutoCommit(false);
を設定して、コミットされていないDBには何も流れないようにしました。しかし、接続を閉じると、setAutoCommit()のステータスに関係なく、すべてのトランザクションがコミットされます。接続はので、私はcon.commit();
の使用は何であると思いまして閉じたときにConnection.setAutoCommit(false)の使用方法を教えてください。 Oracleデータベースを使用している場合?
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");
con.setAutoCommit(false);
st = con.createStatement();
String sql = "INSERT INTO emp (eid, name, dob, address) VALUES (?, ?, ?, ?)";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 8);
statement.setString(2, "kkk");
statement.setDate(3, date);
statement.setString(4, "pppp");
pst = con.prepareStatement(sql);
int rowsInserted = statement.executeUpdate();
//con.commit();
System.out.println ("rowsInserted "+rowsInserted);
con.close();
でもcon.commit();
行をコメントの後に挿入されていますか?
Another answerそれは、ベンダー固有のだと言う:接続がコミット明示的またはロールバックせずに閉じられた場合
。 JDBCは特にここでは何も要求しないので、その動作はデータベースベンダーに依存します。 Oracleの場合は、暗黙のコミットが発行されます。
意味がありません。ありがとうございます。
通常、1つのステートメントに対してのみ接続を開きます。あなたはそれを開いたままにします(例えば、接続プール内)。オートコミットを使用すると、マルチステートメントトランザクションをどのようにロールバックしますか? –
Oracleでは、[transanction](https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html)の定義がドキュメントにあります。しかし、closeメソッドを呼び出すと、実際に起こっていることはすべて、トランザクション後のすべてのステートメントが完了しなければならないというACIDプロパティに従った単一トランザクションの形式になっているため、データを保存しています。 – legend
明示的なコミットまたはロールバックなしで接続を閉じると、他のJDBCドライバがロールバックすることがあります。 –