http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html
JDBCチュートリアル:finallyブロック内のトランザクションをコミットまたはロールバック
JDBCの本のほとんどでは、続いているトランザクション管理イディオムは、ステートメントがコミット更新を実行した後、ある、とSQLExceptionがスローされた場合、ロールバック。
あれは、
接続コン= NULL;
試す{
CON = // ...
con.setAutoCommit(偽);
声明stmt1 = ...
stmt1.executeUpdate();
//いくつかの操作の
声明stmt2 = ...
stmt2.executeUpdate();
con.commit();
con.setAutoCommit(真の);
}キャッチ(のSQLException e)は{
(CON = nullで!)であれば{
{みてください
)(con.rollbackを。
}キャッチ(のSQLException e)は{
//エラーをログに記録します...
}
}
}
同様の構造をして続いている JDBC(TM)APIの
チュートリアルとリファレンス Sun Microsystemsのから。見てい たトランザクションのチュートリアル と サンプルコード 提供を。
コミットやロールバックのこの方法に重大な問題があります。問題は、我々は唯一のSQLExceptionを処理しているです。RuntimeExceptionは、最初の更新ステートメントを実行した後が、2番目の更新ステートメントbeforethe発生した場合はどうなりますか?
トランザクションが開かれたが、どちらもコミットもロールバックされます。これはトラブルにデータの整合性を残します。我々は(ほとんどの場合のように)同じ接続を再利用している、と私たちは次の文でトランザクションをコミットした場合、我々は深刻な問題にしています。私たちは、inconsitentデータを持っています。
解決策は何ですか?
代わりのSQLExceptionのキャッチ例外は
単純ではない推奨される解決策は、RuntimeExceptionを含むすべてのexeceptionsを、キャッチしています。今でも、エラーがスローされているものならば、OutOfMemoryErrorが発生もしくは何らかのないVirtualMachineErrorまたは何か他のものは言いますか?これまでのコードで何が起こるか、我々は、いずれかのデータベースがコミットまたはロールバックされなければならない必要があります。だから、最悪の事態は、私たちが代わりに例外で、Throwableクラスをキャッチする必要があります。
我々はThrowableクラスまたは少なくともExceptionクラスをキャッチする必要があるトランザクションを使用するたびに、これは、厄介な見てませんか?
最終的には使用ブロック
クリーンソリューションを、まだ簡単な解決策があり、使用がfinallyブロック。常にfinallyブロックは、任意の例外がスローされた場合でも、またはメソッドが返された場合にも実行されることが保証されているので。
接続コン= NULL;
ブール成功=偽;
試す{
CON = // ...
con.setAutoCommit(偽);
声明stmt1 = ...
stmt1.executeUpdate();
//いくつかの操作の
声明stmt2 = ...
stmt2.executeUpdate();
成功=はtrue。
}キャッチ(のSQLException E){
成功= FALSE;
}最後に{
場合(!CON = NULL){
しようと{
場合(成功){
con.commit();
con.setAutoCommit(真の);
}他{
con.rollback()。
}
}キャッチ(のSQLException e)は{
//エラーをログに記録します...
}
}
}
ます。https://www.cnblogs.com/kungfupanda/p/5898547.htmlで再現