1. Spring의 트랜잭션 메커니즘
모든 데이터 액세스 기술에는 트랜잭션 처리 메커니즘이 있습니다. 이러한 기술은 트랜잭션을 시작하고, 트랜잭션을 제출하여 데이터 작업을 완료하거나, 오류 발생 시 데이터를 롤백하는 API를 제공합니다.
Spring의 트랜잭션 메커니즘은 통합된 메커니즘을 사용하여 다양한 데이터 액세스 기술을 사용하여 트랜잭션을 처리합니다. Spring의 트랜잭션 메커니즘은 PlatformTransactionManager 인터페이스를 제공합니다. 서로 다른 데이터 액세스 기술을 사용하는 트랜잭션은 서로 다른 인터페이스 구현을 사용합니다.
프로그램에서 트랜잭션 관리자를 정의하는 코드는 다음과 같습니다.
@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
콘솔:
데이터베이스:
(2) 롤백 없음: http://localhost:5000/staff/notrollback?name=张三&age=18
콘솔:
데이터베이스:
위 내용은 SpringBoot 트랜잭션 처리 메커니즘은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!