JDBC接続がAutoCommitモードにある場合、デフォルトでは、すべてのSQLステートメントが完了したときにデータベースにコミットされます。
これは簡単なアプリケーション用かもしれませんが、3つの理由により、自動コミットをオフにして、独自のトランザクションを管理することをお勧めします。
トランザクションを制御し、データベースに変更が適用される場合。単一のSQLステートメントまたはSQLステートメントのセットを論理ユニットとして取得します。また、ステートメントが失敗した場合、トランザクション全体が失敗します。
有効にするには、デフォルトで自動コミットモードマニュアルトランザクションサポートを使用するJDBCドライバーの代わりに、接続オブジェクトのSetAutoCommit()メソッドを使用します。ブール値がsetAutoCommit()に渡された場合、自動コミットをオフにします。ブール値を真に渡すことができます。
たとえば、conn connectionという名前のオブジェクトがある場合、次のコードは自動コミットをオフにします。
conn.setautocommit(false);
送信とロールバック
変更が完了したら、変更をコミットしてから、次のように(接続オブジェクト上)コミット(接続オブジェクト)を呼び出します。
conn.commit();
それ以外の場合は、次のコードを使用して、データベースを使用してConnection Connという名前のロールバックの更新が行われます。
conn.rollback();
次の例は、コミットとロールバックオブジェクトの使用方法を示しています。
{//有効な接続オブジェクトconn.setautocommit(false)を想定してください。ステートメントstmt = conn.createstatement();文字列sql = "従業員に挿入" + "値(106、20、 'rita'、 'tez')"; stmt.executeupdate(sql); //文字列sql =「従業員に挿入された " +"値(107、22、 'sita'、 'singh')を破壊する奇形のSQLステートメントを送信します。 stmt.executeupdate(sql); //エラーがない場合。 conn.commit();} catch(sqlexception se){//エラーがある場合。 conn.rollback();}この場合、上記の挿入ステートメントは成功し、すべてが巻き戻されます。
トランザクションコミットとロールバックの例
以下は、トランザクションコミットとロールバックの説明を使用する例です。
このサンプルコードは、前の章の環境とデータベースのインストールに基づいて学習されています。
以下に示すように、次の例からjdbcexample.javaを次の例からコピーします。
//ステップ1。必要なpackagesimport java.sql。*; public class jdbcexample {// jdbcドライバー名とデータベースurl static final string jdbc_driver = "com.mysql.jdbc.driver";静的最終文字列db_url = "jdbc:mysql:// localhost/emp"; //データベース資格情報静的な最終文字列ユーザー= "username";静的な最終文字列パス= "パスワード"; public static void main(string [] args){connection conn = null;ステートメントstmt = null; try {//ステップ2:JDBCドライバーclass.fornameを登録する( "com.mysql.jdbc.driver"); //ステップ3:接続system.out.println( "データベースへの接続..."); conn = drivermanager.getConnection(db_url、user、pass); //ステップ4:自動コミットをfalseとして設定します。 conn.setautocommit(false); //ステップ5:rsの例に必要な引数を使用して、クエリを実行してstatmentを作成します。 system.out.println( "作成ステートメント..."); stmt = conn.createstatement(resultset.type_scroll_insensitive、resultset.concur_updatable); //ステップ6:行を従業員に挿入します。文字列sql = "従業員に挿入" + "値(106、20、 'rita'、 'tez')"; stmt.executeupdate(sql); //ステップ7:従業員にもう1つの行を挿入しますTable sql = "inserting Intellows" + "値(107、22、 'sita'、 'singh')"; stmt.executeupdate(sql); //ステップ8:ここでデータをコミットします。 System.out.println( "ここにデータをコミットする..."); conn.commit(); //ステップ9:利用可能なすべてのレコードをリストします。文字列sql = "IDを選択、最初、最後、従業員からの年齢";結果rs = stmt.executequery(sql); system.out.println( "参照用のリストの結果セット..."); printrs(rs); //ステップ10:クリーンアップ環境rs.Close(); stmt.close(); conn.close(); } catch(sqlexception se){// jdbc se.printstacktrace()のエラーを処理します。 //エラーがある場合は、変更をロールバックします。 system.out.println( "ここでロールバックデータ..."); try {if(conn!= null)conn.rollback(); } catch(sqlexception se2){se2.printstacktrace(); } // end try} catch(例外e){// class.forname e.printstacktrace()のエラーを処理します。 }最後に{//最後にブロックはリソースを閉じるために使用されます{if(stmt!= null)stmt.close(); } catch(sqlexception se2){} //私たちができることは何もありません{if(conn!= null)conn.close(); } catch(sqlexception se){se.printstacktrace(); } //最後にtry try} // try system.out.println( "goodbye!");} // main public static void printrs(resultet rs)throws sqlexception {//最初の列rs.beforefirst()から始めることを確認します。 while(rs.next()){//列name int id = rs.getint( "id"); int age = rs.getint( "age");文字列first = rs.getString( "first");文字列last = rs.getString( "last"); //値system.out.print( "id:" + id); System.out.print( "、age:" + age); System.out.print( "、first:" + first); system.out.println( "、last:" + last); } system.out.println(); } // end printrs()} // jdbcexampleを終了します次に、上記の例を次のようにコンパイルしましょう。
C:> Javac jdbcexample.java
jdbcexampleを実行すると、次の結果が生成されます。
C:> Java jdbcexample
Connecting to database...Creating statement...Inserting one row....Committing data here....List result set for reference....ID: 100, Age: 18, First: Zara, Last: AliID: 101, Age: 25, First: Mahnaz, Last: FatmaID: 102, Age: 30, First: Zaid, Last: KhanID: 103, Age: 28, First: Sumit, Last: MittalID: 106, Age: 20, First: Rita, Last: Tezid:107、Age:22、First:Sita、Last:Singhgoodbye!