1. 봄의 거래 메커니즘
모든 데이터 액세스 기술에는 트랜잭션 처리 메커니즘이있어 트랜잭션을 가능하게하는 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를 사용한 후 스프링 컨테이너는 @transactional 주석에 달하는 메소드 및 클래스를 자동으로 스캔합니다. @EnableTransactionManagement는 다음과 같이 사용됩니다.
@Configuration @EnableTransactionManagement Public Class AppConfig {}3. 클래스 수준에서 @transactional을 사용하십시오
@transactional은 메소드뿐만 아니라 클래스에도 주석을 달 수 있습니다. 클래스에 주석을 달 때,이 클래스의 모든 공개 방법이 트랜잭션 활성화임을 의미합니다. 클래스 레벨 및 메소드 레벨이 클래스 수준에서 @Transactional 주석을 사용하는 경우 메소드 레벨 주석이 클래스 레벨을 사용하여 과부하됩니다.
4. 스프링 데이터 JPA에 대한 거래 지원
Spring Data JPA를 사용하면 모든 기본 메소드에 대한 트랜잭션 지원이 가능하며 readOnly = 부동산은 기본적으로 쿼리 트랜잭션에 대해 활성화됩니다.
이것은 SimpleJParePository가 클래스 수준에서 @transactional (readonly = true)을 정의하는 소스 코드 SimpleJparePository에서 볼 수있는 반면 @transactional 속성은 저장 및 삭제와 관련된 작업에서 다시 작성됩니다. 이 시점에서 Readonly 속성은 거짓이며 다른 쿼리 작업은 여전히 거짓입니다.
5. Spring Boot의 거래 지원
1. 자동으로 트랜잭션 관리자를 구성합니다
JDBC를 데이터 액세스 기술로 사용하는 경우 SpringBoot는 PlatformTransactionManager의 Bean을 정의합니다. org.springframework.boot.autoconfigure.jdbc.datasourcetransactionmanagerautoconfiguration 클래스의 정의를 참조하십시오.
@bean @conditionalonmissingbean @conditionalonbean (datasource.class) public platformtransactionmanager transactionManager () {return new DataSourcetRansactionManager (this.datasource); }JPA를 데이터 액세스 기술로 사용하는 경우 Spring Boot는 JPatransactionManager의 PlatformTransactionManager 구현에 대한 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 보호 정적 클래스 트랜잭션 관리 관리 configuration {}따라서 Spring Boot에서는 @enabletransactionManagement 주석을 활성화 할 필요가 없습니다.
6. 예제 (SpringBoot)
1.pom.xml :
<pectionency> <groupId> org.springframework.boot </groupid> <artifactid> 스프링-부트-스타터 -web </artifactid> </dependency> <groupid> org.springframework.boot </groupid> <arepactid> spring-boot-starter-jpa </artifactid> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트-스타 터다-라스트 </artifactid> </fectionency> <pectionement> <groupid> mysql </groupid> <artifactid> mysql-connector-java </artifactid> runtime </scope </scope> </scope>
2. application.yml :
서버 : 포트 : 5000 스프링 : DataSource : Driver-Class-Name : com.mysql.jdbc.driver URL : jdbc : mysql : // localhost : 3306/test? useunicode = true & char Show-SQL : True
3. 엔티티 클래스 직원 :
@Entity Public Class 직원 {@id @generatedValue Private Long ID; 개인 문자열 이름; 개인 정수 시대; 개인 문자열 주소; 공공 직원 () {super (); } 공공 직원 (긴 ID, 문자열 이름, 정수 연령, 문자열 주소) {super (); this.id = id; this.name = 이름; this.age = age; address = 주소; } // get and set 메소드 생략}}4. 직원의 저장소 :
Public Interface StaffRepository 확장 jparepository <Staff, Long> {}5. 서비스 인터페이스 :
공개 인터페이스 직원 서비스 {공공 직원 SavestaffWithrollback (직원); // Rollingback Public 직원 SavestaffWithoutFlack (직원); // 롤백하지 않음}6. 서비스 구현 :
@Service Public Class StaffserviceImpl은 직원 직원을 구현합니다. // RersonRepository의 Bean을 직접 주입 할 수 있습니다. @override // @transactional 주석의 Rollbackfor 속성을 사용하여 특정 예외를 지정하면 데이터가 롤백됩니다. @transactional (Rollbackfor = {deconegalargumentexception.class}) 공공 직원 SavestaffWithRollback (직원 직원) {직원 S = StaffRepository.save (직원); if (staff.getName (). Equals ( "Zhang San")) {Throw New ImpalargumentException ( "Zhang San 이미 존재, 롤백"); } 반환 s; } @공개 직원 SavestaffWithoutRollback (직원 직원) {직원 S = 직원 직원 .save (직원); if (staff.getName (). Equals ( "Zhang San")) {Throw New ImpalargumentException ( "Zhang San이 이미 존재하고 데이터가 롤백되지 않습니다"); } 반환 s; }}7. 콘트롤러 :
@RestController @RequestMapping ( "/Staff") 공개 클래스 직원 Controller {@autowired Staffservice Staffservice; // 롤백 상황 테스트 @RequestMapping ( "/롤백") 공공 직원 롤백 (직원 직원) {ReturnSTRIPSICE.SAVESTAFFWITHROLLBACK (직원); } // 롤백 상황 테스트 @RequestMapping ( "/notrollback") 공공 직원 Norollback (직원) {returnSTAYSERVICE.SAVESTAFFWITHOUTROLLBACK (직원); }}8. 테스트 실행 :
(1) 롤백 : http : // localhost : 5000/직원/롤백? name = zhang san & age = 18
콘솔:
데이터 베이스:
(2) 롤백 없음 : http : // localhost : 5000/직원/notrollback? name = zhang san & age = 18
콘솔:
데이터 베이스:
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.