1. 結論
Spring のトランザクション管理は、デフォルトではランタイム例外 (java.lang.RuntimeException とそのサブクラス) のみをロールバックします。
メソッドが例外またはチェック例外をスローした場合、Spring トランザクション管理はデフォルトではロールバックを実行しません。
例外の分類の詳細な紹介:
1. 基本概念<BR>Javaの例外構造図を見る
Throwable はすべての例外のルートである java.lang.Throwable
エラーはエラーです、java.lang.Error
例外は例外です、java.lang.Exception
2.例外
一般に、RuntimeException クラスとそのサブクラスのすべてのインスタンスは Checked 例外と Runtime 例外に分けられ、このカテゴリに当てはまらない例外は CheckedException と呼ばれます。
① チェック例外 チェック例外を提供しているのは Java 言語だけです。Java ではチェック例外を処理可能な例外とみなすため、Java プログラムが明示的にチェック例外を処理する必要があります。 Checked 例外を処理しないプログラムの場合、コンパイル時にエラーが発生し、コンパイルできません。これは Java の設計哲学を反映しています。つまり、完璧なエラー処理のないコードは実行される可能性がありません。チェック例外を処理するには 2 つの方法があります
(1) 現在のメソッドが例外の処理方法を知っている場合、try...catch ブロックを使用して例外を処理します。
(2) 現在のメソッドがそれを処理する方法を知らない場合は、メソッドを定義するときに例外をスローすることを宣言します。
次のようにコードをコピーします。
パッケージ cn.xy.test;
インポート java.io.IOException;
/**
※チェック例外のテスト方法
* @著者xy
*
*/
パブリック クラス CheckedExceptionMethods
{
// 例外クラス全体にはcheckedExceptionとRuntimeExceptionの両方が含まれるため、checkedExceptionを処理する必要があります
public void method1() が例外をスローする
{
System.out.println("私は例外をスローする一般クラスのメソッドです");
}
//この例外をキャッチして処理します
public void testMethod1_01()
{
試す
{
メソッド1();
}
catch (例外 e)
{
e.printStackTrace();
}
}
// 例外を渡す
public void testMethod1_02() が例外をスローする
{
メソッド1();
}
public void testMethod1_03() が例外をスローする
{
新しい例外()をスローします。
}
public void testMethod1_04()
{
試す
{
新しい例外()をスローします。
}
catch (例外 e)
{
e.printStackTrace();
}
}
// 通常、checkedException は IOException を表します
public void method2() が IOException をスローする
{
System.out.println("私は IO 例外をスローするメソッドです");
}
public void testMethod2_01()
{
試す
{
メソッド2();
}
catch (例外 e)
{
e.printStackTrace();
}
}
public void testMethod2_02() が例外をスローする
{
メソッド2();
}
}
私たちがよく知っているチェック済み例外には次のものがあります。
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②実行時例外
実行時、除数が0だったり、配列の添字が範囲外だったりすると頻繁に発生し、宣言やキャプチャの表示はプログラムの可読性や動作効率に大きく影響します。したがって、システムはそれらを自動的に検出し、デフォルトの例外ハンドラーに引き渡します。もちろん、処理要件がある場合は、それらを明示的にキャプチャすることもできます。
次のようにコードをコピーします。
パッケージ cn.xy.test;
/**
* 実行時例外のテスト方法
* @著者xy
*
*/
パブリック クラス RuntimeExcetionMethods
{
public void method3() が RuntimeException をスローする
{
System.out.println("私はランタイム例外をスローするメソッドです");
}
public void testMethod3_01()
{
メソッド3();
}
public void testMethod1_02()
{
新しい RuntimeException() をスローします。
}
}
私たちがよく知っている RumtimeException クラスのサブクラスには次のものがあります。
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3.エラープログラム内で制御不能なエラーが発生した場合、通常はユーザーに通知してプログラムの実行を終了します。例外とは異なり、Error およびそのサブクラスのオブジェクトはスローされるべきではありません。
Error はコンパイル時エラーとシステム エラーを表す throwable のサブクラスで、合理的なアプリケーションが検出すべきではない重大な問題を示すために使用されます。
ダイナミック リンク障害、仮想マシン エラーなどのエラーは、Java 仮想マシンによって生成およびスローされます。プログラムはそれを処理しません。
2. デフォルト モードを変更します。 <BR> @Transaction アノテーションで noRollbackFor と RollbackFor を定義して、特定の例外をロールバックするかどうかを指定します。
@Transaction(noRollbackFor=RuntimeException.class)
@Transaction(RollbackFor=Exception.class)
これにより、デフォルトのトランザクション処理方法が変更されます。
3. 啓蒙<BR>これには、例外がスローされたときに Spring のデフォルトのトランザクション処理によって正確に処理されるように、例外をカスタマイズするときにカスタム例外を RuntimeException から継承させる必要があります。