English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Springboot 트랜잭션 관리 상세 설명

Spring Boot 트랜잭션 관리에서는 PlatformTransactionManager 인터페이스를 구현합니다.

public interface PlatformTransactionManager {
  org.springframework.transaction.TransactionStatus getTransaction(org.springframework.transaction.TransactionDefinition transactionDefinition) throws org.springframework.transaction.TransactionException;
  void commit(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException;
  void rollback(org.springframework.transaction.TransactionStatus transactionStatus) throws org.springframework.transaction.TransactionException;
}

spring을 사용할 때-boot-starter-jdbc 의존성을 사용할 때, 프레임워크는 자동으로 DataSourceTransactionManager를 기본으로 주입합니다. 따라서 @Transactional 애노테이션을 사용하여 트랜잭션을 사용할 수 있도록 추가 설정이 필요하지 않습니다.

jdbc 트랜잭션 관리자

Service에서 @Transactional 애노테이션을 가진 메서드는 트랜잭션을 지원합니다. 애노테이션이 클래스에 적용되면 클래스의 모든 메서드가 기본적으로 트랜잭션을 지원합니다.

다중 트랜잭션 관리자 상황

1: TransactionManagementConfigurer 인터페이스를 구현하여 기본적인 트랜잭션 관리자를 반환할 수 있습니다.

2: 특정 실행 메서드에서 value를 설정할 수 있습니다.

Spring 컨테이너에 여러 PlatformTransactionManager 인스턴스가 있고, TransactionManagementConfigurer 인터페이스를 통해 기본 값이 지정되지 않았을 때, @Transactional 애노테이션을 사용할 때는 value를 지정해야 합니다. 지정하지 않으면 예외가 발생합니다.

//@EnableTransactionManagement // annotation transaction management을 시작하면, xml 구성 파일에서 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication implements TransactionManagementConfigurer {
  @Resource(name="txManager2")
  private PlatformTransactionManager txManager2;
  // 트랜잭션 관리자를 수동으로 생성합니다1 datasource 프레임워크는 자동으로 주입됩니다
  //Spring 컨테이너에서는, 우리가 직접 @Bean을 사용하여 만든 것을 우선적으로 로드하며, 프레임워크는 다른 PlatformTransactionManager 구현 클래스를 다시 인스턴스화하지 않습니다.
  @Bean(name = "txManager1")
  public PlatformTransactionManager txManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }
  // 트랜잭션 관리자를 생성합니다2
  @Bean(name = "txManager2")
  public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
    return new JpaTransactionManager(factory);
  }
  // TransactionManagementConfigurer 인터페이스 메서드를 구현하여 여러 트랜잭션 관리자가 존재하는 경우 기본적으로 사용할 트랜잭션 관리자를 표시합니다
  @Override
  public PlatformTransactionManager annotationDrivenTransactionManager() {
    return txManager2;
  }
  public static void main(String[] args) {
    SpringApplication.run(ProfiledemoApplication.class, args);
  }
}

구체적인 구현

@Component
public class DevSendMessage implements SendMessage {
  // 사용자 value를 통해 사용할 트랜잭션 관리자를 구체적으로 지정합니다
  @Transactional(value="txManager1")
  @Override
  public void send() {
    System.out.println(">>>>>>>>Dev Send()<<<<<<<<\
    send2;
  }
  @Transactional
  public void send2() {
    System.out.println(">>>>>>>>Dev Send2()<<<<<<<<");
  }
}

이ز올레이션 레벨

public enum Isolation {
  DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
  READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
  READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
  REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
  SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
  private final int value;
  Isolation(int value) { this.value = value; }
  public int value() { return this.value; }
}
  1. DEFAULT: 이는 기본 값으로, 기본적으로 데이터베이스의 기본 izolace 레벨을 사용합니다. 대부분의 데이터베이스에서 이 값은 READ_COMMITTED입니다.
  2. READ_UNCOMMITTED: 이 izolace 레벨은 트랜잭션이 다른 트랜잭션에서 수정된하지만 아직 submit되지 않은 데이터를 읽을 수 있음을 의미합니다. 이 레벨은DIRTY READ 및 REPEATABLE READ을 방지할 수 없으므로, 이 레벨은 거의 사용되지 않습니다.
  3. READ_COMMITTED: 이 izolace 레벨은 트랜잭션이 다른 트랜잭션에서 이미提交된 데이터만을 읽을 수 있음을 의미합니다. 이 레벨은DIRTY READ을 방지할 수 있으며, 이는 대부분의 경우 추천되는 값입니다.
  4. REPEATABLE_READ: 이 izolace 레벨은 트랜잭션이 전체 과정에서 동일한 쿼리를 여러 번 반복적으로 실행할 수 있음을 의미하며, 매번 반환되는 레코드는 동일합니다. 이러한 쿼리에 추가된 데이터가 있더라도, 이러한 추가된 레코드는 무시됩니다. 이 레벨은DIRTY READ 및 REPEATABLE READ을 방지할 수 있습니다.
  5. SERIALIZABLE: 모든 트랜잭션이 차례대로 하나씩 실행되며, 이로 인해 트랜잭션 간의 중간 상태가 완전히 차단되므로, 이 레벨은DIRTY READ, REPEATABLE READ 및 PHANTOM READ을 방지할 수 있습니다. 하지만 이는 프로그램의 성능에 심각한 영향을 미칠 수 있습니다. 일반적으로 이 레벨은 사용되지 않습니다.

지정 메서드: isolation 속성을 사용하여 설정하면 예를 들어:

@Transactional(isolation = Isolation.DEFAULT)

전파 행위

현재 트랜잭션을 시작하기 전에 트랜잭션 컨텍스트가 이미 존재하는 경우, 트랜잭션 메서드의 실행 행위를 지정할 수 있는 여러 가지 옵션이 있습니다.

org.springframework.transaction.annotation.Propagation 열거 클래스에서 정의된6데이터 전파 행위를 나타내는 열거 값:

public enum Propagation {
  REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
  SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
  MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
  REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
  NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
  NEVER(TransactionDefinition.PROPAGATION_NEVER),
  NESTED(TransactionDefinition.PROPAGATION_NESTED);
  private final int value;
  Propagation(int value) { this.value = value; }
  public int value() { return this.value; }
}

REQUIRED:현재 트랜잭션이 존재하면 이 트랜잭션에 참여하십시오;현재 트랜잭션이 없으면 새 트랜잭션을 생성합니다。기본 값。

SUPPORTS:현재 트랜잭션이 존재하면 이 트랜잭션에 참여하십시오;현재 트랜잭션이 없으면 비트랜잭션 방식으로 계속 실행합니다。

MANDATORY:현재 트랜잭션이 존재하면 이 트랜잭션에 참여하십시오;현재 트랜잭션이 없으면 예외를 발생시킵니다。(강제로 트랜잭션에 포함됩니다)

REQUIRES_NEW:새 트랜잭션을 생성합니다. 현재 트랜잭션이 존재하면 현재 트랜잭션을 일시 중지합니다。(로그 출력에 일반적으로 사용됩니다. 전에 롤백된 경우에도 이 트랜잭션은 실행되고 오류 정보를 기록합니다)

NOT_SUPPORTED:트랜잭션 비대칭으로 실행합니다. 현재 트랜잭션이 존재하면 현재 트랜잭션을 일시 중지합니다。

NEVER:트랜잭션 비대칭으로 실행합니다. 현재 트랜잭션이 존재하면 예외를 발생시킵니다。

NESTED:현재 트랜잭션이 존재하면 현재 트랜잭션의 내장 트랜잭션으로 실행하십시오;현재 트랜잭션이 없으면 이 값은 REQUIRED와 동일합니다。

지정된 메서드: propagation 속성을 사용하여 설정할 수 있습니다. 예를 들어:}

@Transactional(propagation = Propagation.REQUIRED)

트랜잭션 롤백되지 않는 상황

未被捕获의 RuntimeException이 발생할 때만 롤백됩니다

catch에서 발생한 예외를 잡으면 두 번의 삽입 모두가 성공합니다

@Override
  @Transactional
  public void insertandinsert(Staff staff) {
    staffDao.insert(staff);
    try {
      int i = 1 / 0;
    }
      e.printStackTrace();
    }
    staffDao.insert(staff);
  }

서비스 레이어 메서드의 catch 문에서 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 문을 추가하여 수동으로 롤백하면 데이터가 삽입되지 않습니다.

@Override
  @Transactional
  public void insertandinsert(Staff staff) throws Exception {
    try {
      staffDao.insert(staff);
      int i=1/0;
      staffDao.insert(staff);
    }
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
  }

이것이 이 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바라며, 다른 사람들도 지지해 주셔서 감사합니다.

선언: 이 문서의 내용은 인터넷에서 수집되었으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으시면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(이메일을 보내는 경우, #을 @으로 변경하여 신고하고 관련 증거를 제공하십시오. 사실이 확인되면, 이 사이트는 즉시 저작권 침해 내용을 제거합니다.)

추천 합니다