English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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; } }
지정 메서드: 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(이메일을 보내는 경우, #을 @으로 변경하여 신고하고 관련 증거를 제공하십시오. 사실이 확인되면, 이 사이트는 즉시 저작권 침해 내용을 제거합니다.)