类库下载 java类库 스프링 트랜잭션 롤백

스프링 트랜잭션 롤백

Oct 17, 2016 am 09:31 AM

1. 문제 발생

한 가지 방법으로 여러 개의 데이터베이스 저장 작업을 수행할 경우 중간 데이터베이스 작업에서 오류가 발생합니다. 의사 코드는 다음과 같습니다.

public method() {
    Dao1.save(Person1);
    Dao1.save(Person2);

    Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中
    Dao1.save(Person2);
}
로그인 후 복사
  期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存
  正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。
  当遇到这种情况,我们就可以使用Spring的事务解决这个问题。
2、异常的一些基本知识
1) 异常的架构
  异常的继承结构:Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
로그인 후 복사

스프링 트랜잭션 롤백

2) 오류 예외

오류는 작업 중에 매우 심각하고 복구할 수 없는 오류가 발생했음을 나타냅니다. 프로그램 실행 중, 이 경우 애플리케이션은 실행을 중지할 수만 있습니다. 예를 들어 JAVA 가상 머신에 오류가 발생합니다. 오류는 확인되지 않은 예외입니다. 컴파일러는 오류가 처리되었는지 여부를 확인하지 않으며 프로그램에서 오류 유형 예외를 포착할 필요가 없습니다. 일반적인 상황에서는 프로그램에서 Error 유형의 예외가 발생해서는 안 됩니다.

3) RuntimeException

예외에는 RuntimeException 및 기타 RuntimeException이 아닌 예외가 포함됩니다.
RuntimeException은 확인되지 않은 예외입니다. 즉, 컴파일러는 프로그램이 RuntimeException을 처리하는지 여부를 확인하지 않습니다. 프로그램에서 RuntimException 유형의 예외를 포착할 필요가 없으며 RuntimeException 클래스를 선언할 필요도 없습니다. 메소드 본문. RuntimeException이 발생하면 프로그램에 프로그래밍 오류가 발생했다는 의미이므로 RuntimeException을 잡는 대신 오류를 찾아 프로그램을 수정해야 합니다.

4) Checked Exception

프로그래밍에서 가장 많이 사용되는 Exception이기도 한 Checked Exception은 RuntimeException이 아닌 Exception을 상속한 모든 예외를 말합니다. 위 그림의 IOException은 다음과 같습니다. 및 ClassNotFoundException. JAVA 언어는 확인된 예외가 처리되어야 한다고 규정합니다. 컴파일러는 이를 확인하고 메서드 본문에서 확인된 예외를 선언하거나 처리를 위해 확인된 예외를 캡처하기 위해 catch 문을 사용합니다.

3. 예시

여기에 사용된 트랜잭션 구성은 다음과 같습니다.

<!-- Jpa 事务配置 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    
    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
로그인 후 복사

Spring 구성 파일에서 데이터 소스의 defaultAutoCommit이 True로 설정된 경우 , 그런 다음 메소드는 예외를 직접 catch하면 트랜잭션이 롤백되지 않습니다. 예외를 직접 catch하지 않으면 트랜잭션이 롤백됩니다. 예를 들어
과 같은 기록이 있습니다.

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 

<property name="xxx" value="xxx"/> 

<property name="xxx" value="xxx"/>

 ....
 <property name="defaultAutoCommit" value="true" /> 

</bean>
로그인 후 복사

구성 파일에서 이 매개변수를 구성하지 않은 것을 발견할 수 있습니다. 대답은 '아니오'입니다. 데이터베이스 연결 풀 기본 defaultAutoCommit은 true입니다. 아래 소스 코드를 살펴보세요.

스프링 트랜잭션 롤백

그렇다면 이제 두 가지 상황이 있습니다.
상황 1: 예외인 경우 프로그램에서 수동으로 catch되지 않습니다

@Transactional(rollbackOn = { Exception.class })  
public void test() throws Exception {  
     doDbStuff1();  
     doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作   会回滚。  }
로그인 후 복사

상황 2: 프로그램에서 직접 예외를 catch하는 경우

@Transactional(rollbackOn = { Exception.class })  
public void test() {  
     try {  
        doDbStuff1();  
        doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作  不会回滚。  
     } catch (Exception e) {  
           e.printStackTrace();     
     }  
}
로그인 후 복사

이제 예외를 수동으로 catch해야 하고 예외가 발생하면 롤백할 수 있나요?
트랜잭션을 수동으로 롤백하려면 다음과 같이 작성하세요.

@Transactional(rollbackOn = { Exception.class })  
public void test() {  
     try {  
        doDbStuff1();  
        doDbStuff2();  
     } catch (Exception e) {  
          e.printStackTrace();     
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上之后,如果doDbStuff2()抛了异常,                                                                                       //doDbStuff1()是会回滚的  
     }  
}
로그인 후 복사


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)