Jdbc-transactions
JDBC-トランザクション
JDBC接続が_auto-commit_モード(デフォルト)の場合、すべてのSQLステートメントは完了時にデータベースにコミットされます。
単純なアプリケーションでは問題ないかもしれませんが、自動コミットをオフにして独自のトランザクションを管理したい理由が3つあります。
- パフォーマンスを向上させるため。
- ビジネスプロセスの整合性を維持するため。
- 分散トランザクションを使用します。
トランザクションを使用すると、データベースに変更を適用するかどうか、いつ適用するかを制御できます。 単一のSQLステートメントまたはSQLステートメントのグループを1つの論理ユニットとして扱い、いずれかのステートメントが失敗すると、トランザクション全体が失敗します。
JDBCドライバーがデフォルトで使用する_auto-commit_モードの代わりに手動トランザクションサポートを有効にするには、Connectionオブジェクトの* setAutoCommit()*メソッドを使用します。 ブールfalseをsetAutoCommit()に渡すと、自動コミットをオフにします。 ブール値のtrueを渡して、再びオンに戻すことができます。
たとえば、connという名前のConnectionオブジェクトがある場合は、次をコーディングして自動コミットをオフにします-
conn.setAutoCommit(false);
コミットとロールバック
変更が完了し、変更をコミットする場合は、次のように接続オブジェクトで* commit()*メソッドを呼び出します-
conn.commit( );
それ以外の場合、connという名前の接続を使用して行われたデータベースへの更新をロールバックするには、次のコードを使用します-
conn.rollback( );
次の例は、コミットおよびロールバックオブジェクトの使用を示しています-
try{
//Assume a valid connection object conn
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
String SQL = "INSERT INTO Employees " +
"VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(SQL);
//Submit a malformed SQL statement that breaks
String SQL = "INSERTED IN Employees " +
"VALUES (107, 22, 'Sita', 'Singh')";
stmt.executeUpdate(SQL);
//If there is no error.
conn.commit();
}catch(SQLException se){
//If there is any error.
conn.rollback();
}
この場合、上記のINSERTステートメントはどれも成功せず、すべてがロールバックされます。
よりよく理解するために、リンク:/jdbc/commit-rollback [Commit-Example Code]を調べてみましょう。
セーブポイントを使用する
新しいJDBC 3.0 Savepointインターフェースは、追加のトランザクション制御を提供します。 最新のDBMSは、OracleのPL/SQLなどの環境内でセーブポイントをサポートしています。
セーブポイントを設定するとき、トランザクション内で論理的なロールバックポイントを定義します。 セーブポイントを過ぎてエラーが発生した場合は、ロールバックメソッドを使用して、すべての変更を取り消したり、セーブポイントの後に行われた変更のみを取り消したりできます。
Connectionオブジェクトには、セーブポイントの管理に役立つ2つの新しいメソッドがあります-
- * setSavepoint(String savepointName):*新しいセーブポイントを定義します。 また、Savepointオブジェクトを返します。
- * releaseSavepoint(Savepoint savepointName):*セーブポイントを削除します。 パラメーターとしてSavepointオブジェクトが必要なことに注意してください。 このオブジェクトは通常、setSavepoint()メソッドによって生成されたセーブポイントです。
- rollback(String savepointName)*メソッドが1つあり、指定されたセーブポイントに作業をロールバックします。
次の例は、Savepointオブジェクトの使用を示しています-
try{
//Assume a valid connection object conn
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
//set a Savepoint
Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
String SQL = "INSERT INTO Employees " +
"VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(SQL);
//Submit a malformed SQL statement that breaks
String SQL = "INSERTED IN Employees " +
"VALUES (107, 22, 'Sita', 'Tez')";
stmt.executeUpdate(SQL);
//If there is no error, commit the changes.
conn.commit();
}catch(SQLException se){
//If there is any error.
conn.rollback(savepoint1);
}
この場合、上記のINSERTステートメントはどれも成功せず、すべてがロールバックされます。
よりよく理解するために、リンク:/jdbc/jdbc-savepoints [Savepoints-Example Code]を調べてみましょう。