> Java > java지도 시간 > 본문

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

王林
풀어 주다: 2023-05-18 23:04:04
앞으로
1255명이 탐색했습니다.

1. Spring의 트랜잭션 메커니즘

모든 데이터 액세스 기술에는 트랜잭션 처리 메커니즘이 있습니다. 이러한 기술은 트랜잭션을 시작하고, 트랜잭션을 제출하여 데이터 작업을 완료하거나, 오류 발생 시 데이터를 롤백하는 API를 제공합니다.

Spring의 트랜잭션 메커니즘은 통합된 메커니즘을 사용하여 다양한 데이터 액세스 기술을 사용하여 트랜잭션을 처리합니다. Spring의 트랜잭션 메커니즘은 PlatformTransactionManager 인터페이스를 제공합니다. 서로 다른 데이터 액세스 기술을 사용하는 트랜잭션은 서로 다른 인터페이스 구현을 사용합니다.

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

프로그램에서 트랜잭션 관리자를 정의하는 코드는 다음과 같습니다.

@Bean 
public PlatformTransactionManager transactionManager() { 
 JpaTransactionManager transactionManager = new JpaTransactionManager(); 
 transactionManager.setDataSource(dataSource()); 
 return transactionManager; 
}
로그인 후 복사

2. 선언적 트랜잭션

Spring 즉, 트랜잭션을 사용해야 하는 메서드를 선택하기 위해 주석을 사용하는 것입니다. 메서드에 @Transactional 주석을 사용하여 메서드에 트랜잭션 지원이 필요함을 나타냅니다.

@Transactional 
public void saveSomething(Long id, String name) { 
 //数据库操作 
}
로그인 후 복사

여기서 특별한 주의가 필요한 것은 이 @Transactional 주석이 javax.transaction이 아닌 org.springframework.transaction.annotation 패키지에서 온다는 것입니다.

Spring은 선언적 트랜잭션 지원을 활성화하기 위해 구성 클래스에 @EnableTransactionManagement 주석을 제공합니다. @EnableTransactionManagement를 사용한 후 Spring 컨테이너는 @Transactional이라는 주석이 달린 메서드와 클래스를 자동으로 검색합니다. @EnableTransactionManagement의 사용법은 다음과 같습니다.

@Configuration 
@EnableTransactionManagement 
public class AppConfig { 
 
}
로그인 후 복사

3. @Transactional을 클래스 수준에서 사용하세요

@Transactional은 메서드뿐만 아니라 클래스에도 주석을 달 수 있습니다. 클래스에 주석을 달면 이 클래스의 모든 공용 메서드가 트랜잭션이 활성화된다는 의미입니다. @Transactional 주석이 클래스 수준과 메서드 수준 모두에서 사용되는 경우 클래스 수준에서 사용되는 주석이 메서드 수준 주석을 재정의합니다.

4. Spring Data JPA의 트랜잭션 지원

Spring Data JPA는 모든 기본 메소드에 대한 트랜잭션 지원을 가능하게 하며, 쿼리 유형 트랜잭션은 기본적으로 readOnly=true 속성을 활성화합니다.

소스코드 SimpleJpaRepository를 보면 알 수 있는데, SimpleJpaRepository는 클래스 레벨에서 @Transactional(readOnly=true)을 정의하고 있으며, 저장 및 삭제와 관련된 연산에서는 @Transactional 속성이 재작성되어 있다. , 쿼리 작업 readOnly의 나머지 부분은 여전히 ​​false입니다.

5. Spring Boot의 트랜잭션 지원

1. 자동으로 구성된 트랜잭션 관리자

JDBC를 데이터 액세스 기술로 사용할 때 Spring Boot는 PlatformTransactionManager의 DataSourceTransactionManager를 구현하는 Bean을 정의합니다. 구성 정의는 org를 참조하세요. springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration 클래스:

@Bean 
@ConditionalOnMissingBean 
@ConditionalOnBean(DataSource.class) 
public PlatformTransactionManager transactionManager() { 
 return new DataSourceTransactionManager(this.dataSource); 
}
로그인 후 복사

JPA를 데이터 액세스 기술로 사용할 때 Spring Boot는 구성을 위해 PlatformTransactionManager 및 JpaTransactionManager를 구현하는 Bean을 정의합니다. org.springframework.boot.autoconfigure 정의를 참조하세요. .orm.jpa.JpaBaseConfiguration.class 클래스:

@Bean 
@ConditionalOnMissingBean(PlatformTransactionManager.class) 
public PlatformTransactionManager transactionManager() { 
 return new JpaTransactionManager(); 
}
로그인 후 복사

2. 주석 트랜잭션에 대한 지원을 자동으로 설정합니다

트랜잭션을 구성하는 데 특별히 사용되는 Spring Boot의 클래스는 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration입니다. 클래스는 JpaBaseConfiguration 및 DataSourceTransactionManagerAutoConfiguration에 의존합니다.

DataSourceTransactionManagerAutoConfiguration 구성에서는 선언적 트랜잭션에 대한 지원도 활성화됩니다. 코드는 다음과 같습니다.

@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) 
@Configuration 
@EnableTransactionManagement 
protected static class TransactionManagementConfiguration { 
 
}
로그인 후 복사

따라서 Spring Boot에서는 @EnableTransactionManagement 주석을 명시적으로 활성화할 필요가 없습니다.

6. 인스턴스(Springboot)

1.pom.xml:

<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-web</artifactid> 
</dependency> 
<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-data-jpa</artifactid> 
</dependency> 
<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-data-rest</artifactid> 
</dependency> 
<dependency> 
 <groupid>mysql</groupid> 
 <artifactid>mysql-connector-java</artifactid> 
 <scope>runtime</scope> 
</dependency>
로그인 후 복사

2.application.yml:

server: 
 port: 5000 
 
spring: 
 datasource: 
 driver-class-name: com.mysql.jdbc.Driver 
 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 
 username: root 
 password: password 
 
 jpa: 
 hibernate: 
 ddl-auto: update # 第一次简表create 后面用update 
 show-sql: true
로그인 후 복사

3. 엔터티 클래스 Staff:

@Entity 
public class Staff { 
 @Id 
 @GeneratedValue 
 private Long id; 
 private String name; 
 private Integer age; 
 private String address; 
 
 public Staff() { 
 super(); 
 } 
 
 public Staff(Long id, String name, Integer age, String address) { 
 super(); 
 this.id = id; 
 this.name = name; 
 this.age = age; 
 this.address = address; 
 } 
 //省略get、set方法 
}
로그인 후 복사

4.Staff 저장소:

public interface StaffRepository extends JpaRepository<staff> { 
 
}</staff>
로그인 후 복사

5 . 서비스 인터페이스:

public interface StaffService { 
 public Staff saveStaffWithRollBack(Staff staff);//回滚 
 public Staff saveStaffWithoutRollBack(Staff staff);//不回滚 
}
로그인 후 복사

6. 서비스 구현:

@Service 
public class StaffServiceImpl implements StaffService { 
 
 @Autowired 
 StaffRepository staffRepository; //可以直接注入我们的RersonRepository的Bean。 
 
 @Override 
 //使用@Transactional注解的rollbackFor属性,指定特定异常时,数据回滚。 
 @Transactional(rollbackFor = {IllegalArgumentException.class}) 
 public Staff saveStaffWithRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,rollback"); 
 } 
 return s; 
 } 
 
 @Override 
 public Staff saveStaffWithoutRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,数据不回滚"); 
 } 
 return s; 
 } 
}
로그인 후 복사

7.Controller:

@RestController 
@RequestMapping("/staff") 
public class StaffController { 
 @Autowired 
 StaffService staffService; 
 
 //测试回滚情况 
 @RequestMapping("/rollback") 
 public Staff rollback(Staff staff) { 
 return staffService.saveStaffWithRollBack(staff); 
 } 
 
 //测试不回滚情况 
 @RequestMapping("/notrollback") 
 public Staff noRollBack(Staff staff) { 
 return staffService.saveStaffWithoutRollBack(staff); 
 } 
}
로그인 후 복사

8. 테스트 실행:

(1) 롤백: http://localhost:5000/staff/rollback?name=张Three&age= 18

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

콘솔:

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

데이터베이스:

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

(2) 롤백 없음: http://localhost:5000/staff/notrollback?name=张三&age=18

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

콘솔:

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

데이터베이스:

SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?

위 내용은 SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿