2016-10-06 5 views
2

接続を作成するとすぐに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

通常、1つのステートメントに対してのみ接続を開きます。あなたはそれを開いたままにします(例えば、接続プール内)。オートコミットを使用すると、マルチステートメントトランザクションをどのようにロールバックしますか? –

+1

Oracleでは、[transanction](https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html)の定義がドキュメントにあります。しかし、closeメソッドを呼び出すと、実際に起こっていることはすべて、トランザクション後のすべてのステートメントが完了しなければならないというACIDプロパティに従った単一トランザクションの形式になっているため、データを保存しています。 – legend

+1

明示的なコミットまたはロールバックなしで接続を閉じると、他のJDBCドライバがロールバックすることがあります。 –

答えて

0

Oracle documentationは、いつ、なぜこれを使用すべきかについての非常に良い説明を提供する。同じように行ってください!

JDBCコネクションが文法的にまたはデフォルトで自動コミットモードの場合(これはデフォルトでfyiです)、すべてのSQL文は完了時にデータベースにコミットされます。

同じトピックの詳細については、thisの質問を参照してください。

+0

ありがとう!この答えが必要でした。私はその文書を他のタブで開いていたが、私はそれを読まなかった。最初に教訓を受けたレッスン。 – Kislay

1

con.commit()は明示的なコミットであり、トランザクションをコミットする必要があるときはいつでも呼び出すことができます。あなたの場合は、AutoCommitfalseに設定していますが、明示的なコミットまたはロールバックはありません。 Oracle Databaseは、接続を正常に終了するセッションのすべてのトランザクションをコミットします。セッションが異常終了した場合、トランザクションはロールバックされます。

1

Oracleからログオフすると、保留中のトランザクションがコミットされます。これは、sqlplusまたはJDBCドライバをconn.close()まで使用して発生します。コミットを発行するドライバはサーバーではないことに注意してください。ログオフ中、サーバーは保留中の変更をコミットします。保留中の変更がコミットされないようにするには、conn.close()を呼び出す前に、Javaプログラムからconn.rollback()を呼び出すことができます。

あなたはconn.commit()の使用方法を尋ねました。これは、ビジネスロジックの特定の時点でトランザクションを明示的にコミットするために使用されます。たとえば、接続プール内の接続をキャッシュする場合は、接続をプールに戻す前に、自動コミットを無効にして保留中の変更をコミットできます。自動コミットモード(JDBCのデフォルト)を有効にして、変更を明示的にコミットまたはロールバックすることを心配する人もいます。それはあなたのビジネスロジックに依存します。自分自身に尋ねることができます:DMLの実行をロールバックする必要がありますか?答えが「はい」の場合、自動コミットを無効にし、明示的にトランザクションをコミットする必要があります。

関連する問題