1. 결론
Spring의 트랜잭션 관리는 기본적으로 런타임 예외(java.lang.RuntimeException 및 해당 하위 클래스)만 롤백합니다.
메소드가 Exception 또는 Checked 예외를 발생시키는 경우 Spring 트랜잭션 관리는 기본적으로 롤백을 수행하지 않습니다.
예외 분류에 대한 자세한 소개:
1. 기본 개념 <BR>자바의 예외 구조 다이어그램을 살펴보세요.
Throwable은 모든 예외의 루트인 java.lang.Throwable입니다.
오류는 오류입니다. java.lang.Error
예외는 예외입니다. java.lang.Exception
2.예외
일반적으로 Checked 예외와 Runtime 예외로 구분됩니다. RuntimeException 클래스와 그 하위 클래스의 모든 인스턴스를 Runtime 예외라고 하며, 이 범주에 속하지 않는 예외를 CheckedException이라고 합니다.
① Checked 예외 Java 언어에서만 Checked 예외를 제공합니다. Java에서는 Checked 예외를 처리 가능한 예외로 간주하므로 Java 프로그램에서는 Checked 예외를 명시적으로 처리해야 합니다. 프로그램이 Checked 예외를 처리하지 않으면 프로그램 컴파일 시 오류가 발생하여 컴파일할 수 없습니다. 이는 Java의 디자인 철학을 반영합니다. 완벽한 오류 처리가 없는 코드는 실행될 가능성이 없습니다. Checked 예외를 처리하는 방법에는 두 가지가 있습니다.
(1) 현재 메서드가 예외 처리 방법을 알고 있으면 try...catch 블록을 사용하여 예외를 처리합니다.
(2) 현재 메소드가 어떻게 처리해야 할지 모른다면 메소드 정의 시 예외를 발생시키도록 선언한다.
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.xy.test;
import java.io.IOException;
/**
* 확인된 예외 테스트 방법
* @작가xy
*
*/
공개 클래스 CheckedExceptionMethods
{
//전체 예외 클래스에는 checkException과 RuntimeException이 모두 포함되어 있으므로 checkException을 처리해야 함
public void method1()에서 예외가 발생했습니다.
{
System.out.println("나는 예외를 발생시키는 일반 클래스의 메소드입니다.");
}
//이 예외를 잡아서 처리합니다.
공개 무효 testMethod1_01()
{
노력하다
{
메소드1();
}
잡기 (예외 e)
{
e.printStackTrace();
}
}
// 예외 전달
public void testMethod1_02()에서 예외가 발생했습니다.
{
메소드1();
}
public void testMethod1_03()에서 예외가 발생했습니다.
{
새로운 예외()를 던져라;
}
공개 무효 testMethod1_04()
{
노력하다
{
새로운 예외()를 던져라;
}
잡기 (예외 e)
{
e.printStackTrace();
}
}
//checkedException은 일반적으로 IOException을 나타냅니다.
public void method2()가 IOException을 발생시킵니다.
{
System.out.println("나는 IO 예외를 발생시키는 메소드입니다.");
}
공개 무효 testMethod2_01()
{
노력하다
{
메소드2();
}
잡기 (예외 e)
{
e.printStackTrace();
}
}
public void testMethod2_02()에서 예외가 발생했습니다.
{
메소드2();
}
}
우리에게 더 친숙한 Checked 예외는 다음과 같습니다.
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IO예외
②런타임예외
런타임 시 제수가 0이거나 배열 첨자가 범위를 벗어나는 등의 경우 자주 발생하며 처리하기가 까다롭습니다. 선언이나 캡처를 표시하는 것은 프로그램의 가독성과 운영 효율성에 큰 영향을 미칩니다. 따라서 시스템은 이를 자동으로 감지하여 기본 예외 처리기에 넘겨줍니다. 물론 처리 요구 사항이 있는 경우 명시적으로 캡처할 수도 있습니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.xy.test;
/**
* 런타임 예외 테스트 방법
* @작가xy
*
*/
공개 클래스 RuntimeExcetionMethods
{
public void method3()에서 RuntimeException이 발생합니다.
{
System.out.println("나는 런타임 예외를 발생시키는 메소드입니다.");
}
공개 무효 testMethod3_01()
{
메소드3();
}
공개 무효 testMethod1_02()
{
새로운 RuntimeException()을 던져라;
}
}
우리에게 더 친숙한 RumtimeException 클래스의 하위 클래스는 다음과 같습니다.
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3.오류 프로그램에서 통제할 수 없는 오류가 발생하면 일반적인 접근 방식은 사용자에게 알리고 프로그램 실행을 종료하는 것입니다. 예외와 달리 Error 객체와 해당 하위 클래스는 발생하면 안 됩니다.
Error는 컴파일 시간 및 시스템 오류를 나타내는 throwable의 하위 클래스이며 합리적인 애플리케이션이 포착하려고 시도해서는 안 되는 심각한 문제를 나타내는 데 사용됩니다.
동적 링크 실패, 가상 머신 오류 등을 포함하여 JVM(Java Virtual Machine)에서 오류가 생성되고 발생합니다. 프로그램은 이를 처리하지 않습니다.
2. 기본 모드를 변경합니다. <BR> @Transaction 주석에 noRollbackFor 및 RollbackFor를 정의하여 특정 예외를 롤백할지 여부를 지정합니다.
@Transaction(noRollbackFor=RuntimeException.class)
@Transaction(RollbackFor=Exception.class)
이는 기본 트랜잭션 처리 방법을 변경합니다.
3. 깨달음 <BR>예외를 사용자 정의할 때 사용자 정의 예외가 RuntimeException에서 상속되도록 해야 합니다. 그러면 예외가 발생했을 때 Spring의 기본 트랜잭션 처리에 의해 정확하게 처리됩니다.