新しいJDBC3.0 SavePointインターフェイスは、追加のトランザクションコントロールを提供します。ほとんどの最新のDBMSは、Oracle PL/SQLなどの環境でセーブポイントをサポートしています。
保存ポイントを設定するときに、トランザクションの論理ロールバックポイントを定義します。 Savepointが過ぎたときにエラーが発生した場合、ロールバック方法を使用して、すべての変更またはSavePointの後に行われた変更のみを元に戻すことができます。
セーブポイントの管理に役立つ接続オブジェクトには2つの新しい方法があります。
SetSavePoint(String SavePointName):新しいセーブポイントを定義します。また、SavePointオブジェクトも返します。
releasesavepoint(savepoint savepointname):savepointを削除します。パラメーターとしてSavePointオブジェクトが必要であることに注意してください。このオブジェクトは通常、SetSavePoint()メソッドによって生成されます。
指定されたセーブポイントにロールバックするロールバック(String SavePointName)メソッドがあります。
次の例は、SavePointオブジェクトの使用方法を示しています。
{//有効な接続オブジェクトconn.setautocommit(false)を想定してください。ステートメントstmt = conn.createstatement(); // savepoint savepoint savepoint1 = conn.setsavepoint( "savepoint1")を設定します。文字列sql = "従業員に挿入" + "値(106、20、 'rita'、 'tez')"; stmt.executeupdate(sql); //文字列sql =「従業員に挿入された " +"値(107、22、 'sita'、 'tez')を破壊する奇形のSQLステートメントを送信します。 stmt.executeupdate(sql); //エラーがない場合は、変更をコミットします。 conn.commit();} catch(sqlexception se){//エラーがある場合。 conn.rollback(savepoint1);}この場合、上記の挿入ステートメントは成功し、すべてが巻き戻されます。
以下は、SetSavePointとトランザクションチュートリアルを使用してロールバックを説明する例です。
前の章の環境とデータベースのインストールに基づいたこのサンプルコードについて説明しました。
次の例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(); //ステップ6:利用可能なすべてのレコードをリストします。文字列sql = "IDを選択、最初、最後、従業員からの年齢";結果rs = stmt.executequery(sql); system.out.println( "参照用のリストの結果セット...."); printrs(rs); //ステップ7:IDが104を超える行を持つ行を削除します//しかし、そうする前にポイントを保存します。 savepoint savepoint1 = conn.setsavepoint( "rows_deleted_1"); system.out.println( "reding row ...");文字列sql = "従業員からの削除" + "where id = 110"; stmt.executeupdate(sql); //おっと...あまりにも間違った従業員を削除しました! //ステップ8:ロールバックAfetr Save Point2。Conn.Rollback(SavePoint1); //ステップ9:IDが104よりもgraterを持つ行を削除します//しかし、そうする前にポイントを保存します。 savepoint savepoint2 = conn.setsavepoint( "rows_deleted_2"); system.out.println( "reding row ..."); sql = "従業員から削除" + "where id = 95"; stmt.executeupdate(sql); //ステップ10:利用可能なすべてのレコードをリストします。 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
データベースへの接続...ステートメントの作成...リファレンスのリストセット.... ID:95、年齢:20、最初:シマ、ラスト:100、年齢:18、Zara、last:Aliid:101、Age:25、First:First:Fatmaid:102、Age:30、First:Zaid、Last:khanid:30、First:30、sumit:30、sumit、sumid:30、First:110、First:110、First: Sima、last:Chugdeleting row ...削除行....リファレンスのリストセット.... ID:100、Age:18、First:Zara、last:101、Age:25、First:Mahnaz、Fatmaid:102、Age:30、First:Zaid、Khanid:103、Age:30、First:First:Sumit、Mitalid:110、Simad:110、Mittalid:110: Chuggoodbye!